通过字典列表过滤 pandas DataFrame
Posted
技术标签:
【中文标题】通过字典列表过滤 pandas DataFrame【英文标题】:Filter pandas DataFrame through list of dicts 【发布时间】:2015-12-22 06:16:55 【问题描述】:我有任意长度的 DataFrame,有 X 列(比如说 10):
>>> names = ['var_' + str(x) for x in range(1, 11)]
>>> names
['var_1', 'var_2', 'var_3', 'var_4', 'var_5', 'var_6', 'var_7', 'var_8', 'var_9', 'var_10']
>>> df = pd.DataFrame(np.random.randint(100, size=(10,10)), columns = names)
>>> df
var_1 var_2 var_3 var_4 var_5 var_6 var_7 var_8 var_9 var_10
0 39 49 6 39 16 41 8 86 23 52
1 6 16 21 20 81 97 83 25 56 73
2 72 97 43 50 10 46 22 75 7 18
3 20 35 69 59 14 24 57 31 47 20
4 39 93 45 80 74 87 83 50 52 67
5 93 75 83 67 40 46 79 11 31 95
6 75 76 57 82 69 98 74 75 93 13
7 35 19 28 67 39 23 72 16 63 67
8 93 87 52 25 63 29 46 64 78 12
9 81 43 4 90 88 64 1 83 26 22
现在我想使用字典列表逐行过滤这个 DataFrame:
>>> test_dict_1 = 'var_1': 89, 'var_2': 12, 'var_3': 34
>>> test_dict_2 = 'var_7': 3, 'var_2': 11, 'var_4': 19, 'var_1': 9
>>> test_dict_3 = 'var_3': 31
>>> filter = [test_dict_1, test_dict_2, test_dict_3]
要得到一些结果(dict?DataFrame?很少 DataFrames?),它只包含那些至少通过了一个过滤器的行(即所有变量在行中的值与过滤器中的值相同)。除此之外,我当然需要知道哪些过滤器通过了。
我对 pandas 很陌生,所以如果我能在没有“for”循环的情况下做到这一点,我会有点困惑。请问有什么解决办法吗?
我知道像 df[(df.A == 1) & (df.D == 6)] 这样的链式解决方案,但是有没有可能有几个不同的过滤器? 最终目标是通过过滤器标记每一行,而不是循环。
【问题讨论】:
【参考方案1】:我不确定我是否正确,但如果您想通过字典中的几个条件过滤数据框,您可以执行以下操作:
In [107]: df
Out[107]:
var_1 var_2 var_3 var_4 var_5 var_6 var_7 var_8 var_9 var_10
0 45 36 84 24 86 26 44 6 44 15
1 72 16 67 75 87 89 8 68 32 49
2 9 49 0 4 77 75 65 9 45 70
test_dict_1 = 'var_1': 72, 'var_2': 16, 'var_3': 67
cond = True
for var in test_dict_1.keys():
cond = cond & (df[var] == test_dict_1[var])
df = df.loc[cond]
然后你会得到:
In [109]: df
Out[109]:
var_1 var_2 var_3 var_4 var_5 var_6 var_7 var_8 var_9 var_10
1 72 16 67 75 87 89 8 68 32 49
【讨论】:
那是一个字典,是的,我在我的问题中提到了这个解决方案。我正在谈论使用字典列表进行过滤,即几乎没有类似的字典。我想我必须使用循环。以上是关于通过字典列表过滤 pandas DataFrame的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用字典列表创建dataframe(list of dictionaries)pandas使用字典数据创建dataframe(dictionary)
将 pandas.DataFrame 转换为 Python 中的字典列表