使用动态URL查询字符串过滤Pandas DataFrames

时间:2015-06-05 03:45:26

标签: python pandas

目前我在python pandas中遇到了一个问题。我想动态地使用url查询字符串过滤数据帧。

例如: CSV:

enter image description here

url:http://example.com/filter?Name=Sam&Age=21&Gender=male

硬编码

filtered_data = data[
    (data['Name'] == 'Sam') &
    (data['Age'] == 21) &
    (data['Gender'] == 'male') 
];

我不想像以前那样对过滤器密钥进行硬编码,因为csv文件会随时更改不同的列标题。 任何建议

3 个答案:

答案 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}}进行匹配。