根据存储在字典中的条件从 Pandas 数据框中选择数据

use*_*097 7 python dataframe pandas

我有一个包含大量变量的 Pandas 数据框。这可以简化为:

tempDF = pd.DataFrame({ 'var1': [12,12,12,12,45,45,45,51,51,51],
                        'var2': ['a','a','b','b','b','b','b','c','c','d'],
                        'var3': ['e','f','f','f','f','g','g','g','g','g'],
                        'var4': [1,2,3,3,4,5,6,6,6,7]})
Run Code Online (Sandbox Code Playgroud)

如果我想选择数据帧的一个子集(例如 var2='b' 和 var4=3),我会使用:

tempDF.loc[(tempDF['var2']=='b') & (tempDF['var4']==3),:]
Run Code Online (Sandbox Code Playgroud)

但是,如果匹配条件存储在字典中,是否可以选择数据帧的子集,例如:

tempDict = {'var2': 'b','var4': 3}
Run Code Online (Sandbox Code Playgroud)

重要的是变量名称不是预定义的,并且字典中包含的变量数量是可变的。

我一直对此感到困惑一段时间,因此任何建议将不胜感激。

Ant*_*pov 2

您可以使用列表理解为每个条件创建掩码,然后通过转换为数据帧并使用以下方式将它们连接起来all

In [23]: pd.DataFrame([tempDF[key] == val for key, val in tempDict.items()]).T.all(axis=1)
Out[23]:
0    False
1    False
2     True
3     True
4    False
5    False
6    False
7    False
8    False
9    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)

然后您可以使用该掩码对数据框进行切片:

mask = pd.DataFrame([tempDF[key] == val for key, val in tempDict.items()]).T.all(axis=1)

In [25]: tempDF[mask]
Out[25]:
   var1 var2 var3  var4
2    12    b    f     3
3    12    b    f     3
Run Code Online (Sandbox Code Playgroud)