python - 如何编写函数来动态查询熊猫数据框?
问题描述
假设我有一个 pandas 数据框,我需要从中重复查询行的子集。我想把它包装在一个函数中。查询会有所不同,询问任意数量的列。每列的运算符将始终相同。我正在考虑这样的事情:
df = pd.DataFrame({'A': list('aabbccddeeff'), 'B': list('aaaabbbbcccc'),
'C': np.random.randint(5, size=12),
'D': np.random.randint(9, size=12)})
def query_df(df, **kwds):
a_val = kwds.get('a', None)
b_val = kwds.get('b', None)
c_val = kwds.get('c', None)
d_val = kwds.get('d', None)
query = 'A in {0} and B == {1} and C > {2} and D < {3}'.format(a_val, b_val, c_val, d_val)
return df.query(query)
query_dict = {'a':['a', 'b', 'c', 'd'], 'b':'a', 'c':0, 'd':8}
print(query_df(df, **query_dict))
A B C D
1 a a 1 6
虽然这可行,但它不允许查询定向到例如列 A 和 C。所有列都被硬编码到查询字符串中!我怎样才能使它更灵活,以便例如以下也可以工作:
query_df(df, {'a':['a', 'b', 'c', 'd'], 'b':'a'})
query_df(df, {'b':'a', 'c':6})
query_df(df, {'d':4})
提前致谢!
解决方案
为了让您了解如何实现这一目标:
import pandas as pd
import numpy as np
df = pd.DataFrame({'A': list('aabbccddeeff'), 'B': list('aaaabbbbcccc'),
'C': np.random.randint(5, size=12),
'D': np.random.randint(9, size=12)})
print(df)
def query_df(df, dicti):
d = {
'a' : 'A in %s' % dicti.get('a'),
'b' : 'B == %s' % dicti.get('b'),
'c' : 'C > %s' % dicti.get('c') ,
'd' : 'D < %s' % dicti.get('d')
}
q = []
for i, j in d.items():
if i in dicti.keys():
q.append(j)
q.append(' and ')
q = q[:len(q)-1]
query = ''.join(q)
print(query)
return df.query(query)
#di = {'a':['a', 'b', 'c', 'd'], 'b':'"a"', 'c':0, 'd':8}
#di = {'b':'"a"', 'c':6}
#di = {'d':4}
di = {'a':['a', 'b', 'c', 'd'], 'b':'"a"'}
print(query_df(df, di))
正如您可能注意到的,我不得不对 'b' 键 ('b':'"a"') 使用双引号。
推荐阅读
- docker - 如何使用已配置的应用程序文件夹创建 docker 映像
- amazon-kinesis - 将凭证添加到 AmazonKinesisAsyncClientBuilder
- ios - 如何从使用 RxSwift 返回 Observable 的服务中获取值
- spring-boot - 使用微服务和 Spring Boot 的分布式事务
- c++ - 使用 boost::pool 时 CPU 使用率高
- reactjs - 如何使具有可选功能的功能组件去抖动?
- loops - 使用 Postman 在 URL 中循环多个变量
- python - 如何使用Selenium Python从duckduckgo的搜索结果中提取文本
- linkedin - REQUEST_BODY 中的字段值验证失败:处理linkedin ugcPost 上的字段[/author] 时出现数据处理异常
- android - 断言已处理的异常