gpt4 book ai didi

python - Groupby 包含两个特定值 - pandas

转载 作者:行者123 更新时间:2023-12-04 07:48:32 25 4
gpt4 key购买 nike

我的目标是返回包含按单独列分组的两个特定值的 Pandas df 中的行。使用下面,我按 Num 分组并旨在返回 B 的行存在但不存在 A对于每个独特的组。
如果两者都不是 A也不是 B被分配给一个分组值然后继续。我只想返回 B 所在的行存在但不存在 A .

import pandas as pd

df = pd.DataFrame({
'Num' : [1,1,2,2,2,2,3,3,4,4,4,4],
'Label' : ['X','Y','X','B','B','B','A','B','B','A','B','X'],
})

df = df.loc[(df['Label'] == 'A') | (df['Label'] == 'B')]
df = df.groupby('Num').filter(lambda x: any(x['Label'] == 'A'))
df = df.groupby('Num').filter(lambda x: any(x['Label'] == 'B'))
预期输出:
    Num Label  
2 2 B
3 2 B
4 2 B
5 2 B

最佳答案

您可以过滤每组的所有值是否为 B来自 GroupBy.transform GroupBy.all :

df1 = df.loc[(df['Label'] == 'A') | (df['Label'] == 'B')]
df1 = df1[(df1['Label'] == 'B').groupby(df1['Num']).transform('all')]
print (df1)
Num Label
3 2 B
4 2 B
5 2 B
如需要fitler原创栏目 Num用:
df = df[df['Num'].isin(df1['Num'])]
print (df)
Num Label
2 2 X
3 2 B
4 2 B
5 2 B
另一种方法是按 numpy.setdiff1d 过滤:
num = np.setdiff1d(df.loc[(df['Label'] == 'B'), 'Num'],
df.loc[(df['Label'] == 'A'), 'Num'])

df = df[df['Num'].isin(num)]
print (df)
Num Label
2 2 X
3 2 B
4 2 B
5 2 B

关于python - Groupby 包含两个特定值 - pandas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67088791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com