目前我在python pandas中遇到了一个问题。我想动态地使用url查询字符串过滤数据帧。
例如: CSV:
url:http://example.com/filter?Name=Sam&Age=21&Gender=male
硬编码:
filtered_data = data[
(data['Name'] == 'Sam') &
(data['Age'] == 21) &
(data['Gender'] == 'male')
];
我不想像以前那样对过滤器密钥进行硬编码,因为csv文件会随时更改不同的列标题。 任何建议
答案 0 :(得分:2)
动态创建此过滤器的最简单方法可能是使用np.all
。
例如:
import numpy as np
query = {'Name': 'Sam', 'Age': 21, 'Gender': 'male'}
filters = [data[k] == v for k, v in query.items()]
filter_data = data[np.all(filters, axis=0)]
答案 1 :(得分:2)
使用df.query
。例如
df = pd.read_csv(url)
conditions = "Name == 'Sam' and Age == 21 and Gender == 'Male'"
filtered_data = df.query(conditions)
您可以使用字符串格式(如
)动态构建条件字符串conditions = " and ".join("{} == {}".format(col, val)
for col, val in zip(df.columns, values)
答案 2 :(得分:1)
通常,您的Web框架将以类似dict的结构返回参数。让我们说你的args是这样的:
args = {
'Name': ['Sam'],
'Age': ['21'], # Note that Age is a string
'Gender': ['male']
}
您可以按照以下方式连续过滤数据集:
for key, values in args.items():
data = data[data[key].isin(values)]
但是,这可能与Age
的任何数据都不匹配,pd.read_csv(filename, dtype=object)
可能已作为整数加载。在这种情况下,您可以通过for key, values in args.items():
data = data[data[key].astype(str).isin(values)]
将CSV文件作为字符串加载,或者在比较之前转换为字符串:
args = {
'Name': ['Sam', 'Ben'], # There are 2 names
'Age': ['21'],
'Gender': ['male']
}
顺便提一下,这也会匹配多个值。例如,使用URL http://example.com/filter?Name=Sam&Name=Ben&Age=21&Gender=male - 这将导致结构:
.isin
在这种情况下,Ben和Sam都会匹配,因为我们正在使用{{1}}进行匹配。