[英]Pandas DataFrame : How to select rows on multiple conditions?
我正在嘗試根據需要滿足的條件列表選擇DataFrame的行。 這些條件存儲在字典中,格式為{column:max-value}。
這是一個例子: dict = {'name': 4.0, 'sex': 0.0, 'city': 2, 'age': 3.0}
我需要選擇所有DataFrame行,其中相應的屬性小於或等於字典中的相應值。
我知道根據兩個或多個條件選擇行我可以寫:
rows = df[(df[column1] <= dict[column1]) & (df[column2] <= dict[column2])]
我的問題是,如何以Pythonic方式選擇與字典中存在的條件匹配的行? 我這樣試過,
keys = dict.keys()
rows = df[(df[kk] <= dict[kk]) for kk in keys]
但它給了我一個錯誤=“ [ expected
”即使放[
符號也不會消失[
。
我們可以像這樣使用DataFrame.query()方法:
In [109]: dct = {'name': 4.0, 'sex': 0.0, 'city': 2, 'age': 3.0}
In [110]: qry = ' and '.join(['{} <= {}'.format(k,v) for k,v in dct.items()])
In [111]: qry
Out[111]: 'name <= 4.0 and sex <= 0.0 and city <= 2 and age <= 3.0'
In [112]: df.query(qry)
...
您可以利用Pandas的自動軸對齊。 給定具有['age', 'city', 'name', 'sex']
和具有相同索引的Series的DataFrame,您可以將DataFrame中的每個條目與Series中的相應值進行比較
In [29]: df < pd.Series(dct)
Out[29]:
age city name sex
0 False False False False
1 False False False False
2 True False False False
3 False True False False
4 True True True False
...
然后你可以找到所有使用True
的行
mask = (df <= pd.Series(dct)).all(axis=1)
並使用df.loc[mask, :]
選擇那些行。 例如,
import numpy as np
import pandas as pd
np.random.seed(2017)
N = 300
df = pd.DataFrame({'name':np.random.randint(10, size=N),
'sex':np.random.randint(2, size=N),
'city':np.random.randint(10, size=N),
'age':np.random.randint(10, size=N)})
dct = {'name': 4.0, 'sex': 0.0, 'city': 2, 'age': 3.0}
mask = (df <= pd.Series(dct)).all(axis=1)
print(df.loc[mask, :])
產量
age city name sex
7 3 2 0 0
10 1 2 4 0
150 1 2 4 0
188 2 2 2 0
198 3 2 3 0
229 1 2 0 0
254 1 2 2 0
275 3 2 1 0
276 0 1 4 0
299 3 1 2 0
你也可以嘗試:
import pandas as pd
import numpy as np
N = 300
df = pd.DataFrame({'name':np.random.randint(10, size=N),
'sex':np.random.randint(2, size=N),
'city':np.random.randint(10, size=N),
'age':np.random.randint(10, size=N)})
dct = {'name': 4.0, 'sex': 0.0, 'city': 2, 'age': 3.0}
df.loc[np.prod([df[k] <= v for k,v in dct.items()],axis=0).astype(bool),:]
# age city name sex
# 7 3 2 0 0
# 10 1 2 4 0
# 150 1 2 4 0
# 188 2 2 2 0
# 198 3 2 3 0
# 229 1 2 0 0
# 254 1 2 2 0
# 275 3 2 1 0
# 276 0 1 4 0
# 299 3 1 2 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.