我需要按一列对数据框进行分组,然后过滤掉另一列中不包含特定值的所有组。
例如,这是我的数据框:
A B
1 False
1 True
2 False
2 False
3 True
3 False
4 False
我想按 A 列进行分组,然后删除 B 列中不包含 True 的所有组(因此仅在示例中保留 1 和 3 的组)。
我正在尝试的代码是:
df.groupby('A').filter(lambda x:True in x['B'])
然而,这返回的是空的。为什么这不起作用?提前致谢。
第一个想法是过滤所有A
价值观与True
in B
列并传递到Series.isin http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.isin.html通过原件检查会员资格A
列和过滤依据boolean indexing http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#boolean-indexing:
df1 = df[df['A'].isin(df.loc[df.B, 'A'])]
或者你可以使用GroupBy.transform http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.transform.html测试是否至少有一个True
每组由GroupBy.any http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.groupby.GroupBy.any.html:
df1 = df[df.groupby('A')['B'].transform('any')]
print (df1)
A B
0 1 False
1 1 True
4 3 True
5 3 False
您的解决方案可能会随着测试一而改变True
每组由Series.any http://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.any.html,但如果 DataFrame 较大或有很多组,则速度最慢:
df1 = df.groupby('A').filter(lambda x: x['B'].any())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)