繁体   English   中英

Python Dataframe Pandas - 过滤 Z6A8064B5DF4794555500553C47C55055DZ 行的条件子集

[英]Python Dataframe Pandas - Filter dataframe rows by condition issubset() on column values

我想过滤 Dataframe 行,具体取决于列表的所有项目是否都存在于criteria_a列中,以获得criteria_b列中的固定值。

例如,让我们考虑以下 Dataframe:

df = pd.DataFrame({'criteria_a': [1, 2, 3, 4, 1, 1, 2, 3, 4], 
                   'criteria_b': [2, 2, 2, 3, 7, 9, 9, 9, 9], 
                   'value': [0.2, 0.6, 0.1, 0.9, 0.8, 0.7, 0.3, 0.8, 0.1]})

print(df)

   criteria_a  criteria_b  value
0           1           2    0.2
1           2           2    0.6
2           3           2    0.1
3           4           3    0.9
4           1           7    0.8
5           1           9    0.7
6           2           9    0.3
7           3           9    0.8
8           4           9    0.1

criteria_a列的可能值为list_criteria_a = [1, 2, 3, 4]

我想创建一个新的 dataframe ,它只提取列表list_criteria_a中的所有项目对于给定的criteria_b值都存在的行。

上述示例的结果将只有最后四行:

   criteria_a  criteria_b  value
0           1           9    0.7
1           2           9    0.3
2           3           9    0.8
3           4           9    0.1

我知道我们必须使用issubset() ,但我不知道如何。 它与帖子非常相似( 如果行包含列表中的所有项目,我如何在 pandas 中获取行的索引? )除了我想过滤行,而不是输出它们的索引,还有一个额外的条件。

非常感谢!

For compare values per groups is best here use GroupBy.transform with custom function for compare set by issubset method, output is boolean Series, so possible filter by boolean indexing :

f = lambda x: set(list_criteria_a).issubset(x)
df1 = df[df.groupby('criteria_b')['criteria_a'].transform(f)]
print (df1)
   criteria_a  criteria_b  value
5           1           9    0.7
6           2           9    0.3
7           3           9    0.8
8           4           9    0.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM