假设我具有以下数据框:
df = pd.DataFrame({'color':['red', 'green', 'blue'], 'brand':['Ford','fiat', 'opel'], 'year':[2016,2016,2017]})
brand color year
0 Ford red 2016
1 fiat green 2016
2 opel blue 2017
我知道要使用多个列进行选择,我可以执行以下操作:
new_df = df[(df['color']=='red')&(df['year']==2016)]
现在我想做的是找到一种使用字典来选择我想要的行的方法,其中字典的键代表映射到允许值的列。例如,在df上应用以下字典{'color':'red', 'year':2016}
将产生与new_df相同的结果。
我已经可以使用for循环来做到这一点,但我想知道是否有任何更快和/或更多的 pythonic 方式!
请附上方法花费的时间。
答案 0 :(得分:1)
是的,有!您可以使用简单的列表推导方法构建查询字符串,然后将该字符串传递给query
进行动态评估。
query = ' and '.join([f'{k} == {repr(v)}' for k, v in m.items()])
# query = ' and '.join(['{} == {}'.format(k, repr(v)) for k, v in m.items()])
new_df = df.query(query)
print(query)
# "color == 'red' and year == 2016"
print(new_df)
color brand year
0 red Ford 2016
有关query
(和eval
)的更多信息,请在此处查看我的信息:Dynamic Expression Evaluation in pandas using pd.eval()
为获得更好的性能,并使用空格处理列名称等,请使用logical_and.reduce
:
df[np.logical_and.reduce([df[k] == v for k,v in m.items()])]
color brand year
0 red Ford 2016
答案 1 :(得分:1)
带有单个表达式:
In [728]: df = pd.DataFrame({'color':['red', 'green', 'blue'], 'brand':['Ford','fiat', 'opel'], 'year':[2016,2016,2017]})
In [729]: d = {'color':'red', 'year':2016}
In [730]: df.loc[np.all(df[list(d)] == pd.Series(d), axis=1)]
Out[730]:
brand color year
0 Ford red 2016