Python 特定の列に対する指定条件で、行データ(外れ値)を削除する方法「Pandasのquery」

 本記事では表題のことを成す雛形コードを載せました。
例題データには、機械学習でお馴染みのボストンデータセットを用いました。入手方法はネット情報から得られます。

▼元データのグラフ化

#!/usr/bin/env python
# coding: utf-8

# In[1]:


import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
plt.rcParams["font.size"] = 16

df = pd.read_csv('boston_dataset.csv')
df


# In[2]:


x_name = 'RM'
y_name = 'PRICE'

# 散布図
plt.scatter(df[x_name], df[y_name])
plt.ylim(0, 55)
plt.xlabel(x_name)
plt.ylabel(y_name)
plt.title('元データ')
plt.grid()
plt.show()

上記より、横軸にRM、縦軸にPRICEをとると下図のようになります。

 

▼列名「PRICE」に対して、40より大きい値を削除したい場合

# In[3]:


# PRICEの列の値が40より大きい値の行を削除(40以下を残す)
df2 = df.query('PRICE <= 40')
df2


# In[4]:


# 散布図
plt.scatter(df2['RM'], df2['PRICE'])
plt.ylim(0, 55)
plt.xlabel(x_name)
plt.ylabel(y_name)
plt.title('PRICE値が40以上を削除(40以下を残す)')
plt.grid()
plt.show()

結果は下記のようになります。

 

▼上位と下位それぞれ5%を外れ値として、除去したい場合

# In[5]:


# PRICEの列に対して、95%以上と5%以下を削除する
thr1 = df[y_name].quantile(0.95)
thr2 = df[y_name].quantile(0.05)
print(thr1, thr2)

df3 = df.query('@thr2 < PRICE <= @thr1')
print(df3)


# In[6]:


# 散布図
plt.scatter(df3['RM'], df3['PRICE'])
plt.ylim(0, 55)
plt.xlabel(x_name)
plt.ylabel(y_name)
plt.title('PRICE値が95%以上と5%以下を削除(5~95%を残す)')
plt.grid()
plt.show()

結果は下記です。

以上

<広告>