python - 使用字典灵活选择 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
我知道要使用多个列进行选择,我可以执行以下操作:
new_df = df[(df['color']=='red')&(df['year']==2016)]
现在我想做的是找到一种方法来使用字典来选择我想要的行,其中字典的键表示映射到允许值的列。例如,{'color':'red', 'year':2016}
在 df 上应用以下字典将产生与 new_df 相同的结果。
我已经可以使用 for 循环来完成它,但我想知道是否有更快和/或更多“ pythonic ”的方式来做到这一点!
请包括方法所花费的时间。
解决方案
就在这里!您可以使用简单的列表推导构建查询字符串,并将字符串传递给以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
)的更多信息,请参阅我的帖子:使用 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
推荐阅读
- android - 如何开发在 VideoView API 中工作的 264" 编解码器格式?
- sql - SQL比较操作
- keycloak - KeyCloak 将用户管理限制在某些组,同时启用“管理用户”
- c# - System.InvalidOperationException:无法使用单例“Microsoft.Extensions.Hosting.IHostedService”中的范围服务“MyDbContext”
- c++ - 架构 x86_64 的未定义符号:在终端中编译两个 cpp 文件时
- javascript - 将对象分解为更小的对象
- mercurial - Mercurial 子存储库不同的文件夹
- json - 使用 Powershell 调用休息方法和 json 响应
- xml - 在 GO 中解析非标准 XML
- html - 将第一个文本对齐到图像右侧,然后将第二个文本对齐到图像下方