在Pandas中,如何在聚合和过滤之后检索创建每个组的行?

uubf1zoe  于 2023-03-28  发布在  其他
关注(0)|答案(3)|浏览(128)

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
kuarbcqp

kuarbcqp1#

使用GroupBy.transform获取所有True,以便使用与原始 Dataframe 相同的大小进行掩码,因此可以使用boolean indexing

df1 = df[df.groupby('a')['b'].transform('all')]

#alternative
#f = lambda x: x.all()
#df1 = df[df.groupby('a')['b'].transform(f)]
print (df1)
   a     b
0  A  True
1  A  True
5  C  True

如果希望聚合函数中的过滤器输出为布尔序列,则过滤器匹配由原始列aMap的索引:

ids = df.groupby('a')['b'].all()

df1 = df[df.a.isin(ids.index[ids])]
print (df1)
   a     b
0  A  True
1  A  True
5  C  True

您的解决方案与过滤器列b类似:

groups = df.groupby('a')
agg_groups = groups.agg({'b':lambda x: all(x)})

df1 = df[df.a.isin(agg_groups.index[agg_groups['b']])]
print (df1)
   a     b
0  A  True
1  A  True
5  C  True
hsgswve4

hsgswve42#

df[df['a'].isin(filtered_df['a'].unique())]
结果:

a     b
0  A  True
1  A  True
5  C  True
hjzp0vay

hjzp0vay3#

可以通过以各种方式保留filtered_dfa列中存在a列的行来过滤原始df。下面将留下两个潜在的选项。

备选案文1

根据OP使用自定义lambda的请求,可以如下使用pandas.DataFrame.apply

final_df = df[df.apply(lambda row: row['a'] in filtered_df['a'].values, axis=1)]

[Out]:

   a      b
0  A   True
1  A   True
5  C   True

备选案文2

另一种解决方法是通过保留filtered_dfa列中存在a列的行来过滤原始df
为此,可以使用pandas.Series.isin,如下所示

finaldf = df[df['a'].isin(filtered_df['a'])]

[Out]:

   a      b
0  A   True
1  A   True
5  C   True

注:

相关问题