使用字典灵活选择 pandas 数据帧行

Lud*_*udo 5 python select dataframe python-3.x pandas

假设我有以下数据框:

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
Run Code Online (Sandbox Code Playgroud)

我知道要选择使用多列,我可以执行以下操作:

new_df = df[(df['color']=='red')&(df['year']==2016)]
Run Code Online (Sandbox Code Playgroud)

现在我想做的是找到一种方法使用字典来选择我想要的行,其中字典的键表示映射到允许值的列。例如,在 df 上应用以下字典{'color':'red', 'year':2016}将产生与 new_df 相同的结果。

我已经可以用 for 循环来做到这一点,但我想知道是否有更快和/或更“ Pythonic ”的方法来做到这一点!

请包括该方法所花费的时间。

cs9*_*s95 3

就在这里!您可以使用简单的列表理解构建查询字符串,并将该字符串传递给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)
Run Code Online (Sandbox Code Playgroud)

print(query)
# "color == 'red' and year == 2016"

print(new_df)
  color brand  year
0   red  Ford  2016
Run Code Online (Sandbox Code Playgroud)

有关query(和eval) 的更多信息,请参阅我的帖子:使用 pd.eval() 在 pandas 中进行动态表达式评估


为了获得更好的性能,并处理带有空格等的列名,请使用logical_and.reduce

df[np.logical_and.reduce([df[k] == v for k,v in m.items()])] 

  color brand  year
0   red  Ford  2016
Run Code Online (Sandbox Code Playgroud)