首页 > 解决方案 > 根据组过滤 DataFrame 行

问题描述

我正在使用具有以下结构的 DataFrame 学习 Python/Pandas:

import pandas as pd

df = pd.DataFrame({"cus_id" : ["2370", "2370", "5100", "5100", "8450", "8450", "1630", "1630", "1630"], 
                   "cus_group" : ["A", "A", "A", "B", "B", "B", "A", "A", "B"]})

print(df)

  cus_id cus_group
0   2370         A
1   2370         A
2   5100         A
3   5100         B
4   8450         B
5   8450         B
6   1630         A
7   1630         A
8   1630         B

我的目标是过滤上述 DataFrame 的行。具体来说,我只想保留客户属于不同组的行。这是我的尝试:

print(df.drop_duplicates(subset = ["cus_id", "cus_group"], keep = False))

  cus_id cus_group
2   5100         A
3   5100         B
8   1630         B

不幸的是,这不是我正在寻找的确切输出。请注意,cus_id= 1630在原始 DataFrame 中出现了 3 次:在 group 中出现了 2 次,在 group 中出现了A1 次B。由于它属于两个不同的组(AB),因此我不想删除该客户的任何行。也就是说,我正在寻找的输出如下:

  cus_id cus_group
2   5100         A
3   5100         B
6   1630         A
7   1630         A
8   1630         B

我不确定我缺少什么功能来实现我的目标。任何额外的帮助将不胜感激。

标签: pythonpandasdataframe

解决方案


使用groupbyand transformasnunique这将唯一计数作为一个系列,然后只需过滤大于 1:

df[df.groupby('cus_id')['cus_group'].transform('nunique')>1]

  cus_id cus_group
2   5100         A
3   5100         B
6   1630         A
7   1630         A
8   1630         B

推荐阅读