让
import pandas as pd
df = pd.DataFrame(
{
'a': ['A', 'A', 'B', 'B', 'B', 'C'],
'b': [True, True, True, False, False, True]
}
)
print(df)
groups = df.groupby('a') # "A", "B", "C"
agg_groups = groups.agg({'b':lambda x: all(x)}) # "A": True, "B": False, "C": True
agg_df = agg_groups.reset_index()
filtered_df = agg_df[agg_df["b"]] # "A": True, "C": True
print(filtered_df)
# Now I want to get back the original df's rows, but only the remaining ones after group filtering
电流输出:
a b
0 A True
1 A True
2 B True
3 B False
4 B False
5 C True
a b
0 A True
2 C True
要求:
a b
0 A True
1 A True
2 B True
3 B False
4 B False
5 C True
a b
0 A True
2 C True
a b
0 A True
1 A True
5 C True
3条答案
按热度按时间kuarbcqp1#
使用
GroupBy.transform
获取所有True,以便使用与原始 Dataframe 相同的大小进行掩码,因此可以使用boolean indexing
:如果希望聚合函数中的过滤器输出为布尔序列,则过滤器匹配由原始列
a
Map的索引:您的解决方案与过滤器列
b
类似:hsgswve42#
df[df['a'].isin(filtered_df['a'].unique())]
结果:
hjzp0vay3#
可以通过以各种方式保留
filtered_df
的a
列中存在a
列的行来过滤原始df
。下面将留下两个潜在的选项。备选案文1
根据OP使用自定义lambda的请求,可以如下使用
pandas.DataFrame.apply
备选案文2
另一种解决方法是通过保留
filtered_df
的a
列中存在a
列的行来过滤原始df
。为此,可以使用
pandas.Series.isin
,如下所示注:
.apply()
有强烈的意见。建议阅读以下内容:When should I (not) want to use pandas apply() in my code?