Python 基于组筛选数据帧行

Python 基于组筛选数据帧行,python,pandas,dataframe,Python,Pandas,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)

我正在使用具有以下结构的数据帧学习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
我的目标是过滤上述数据帧的行。具体来说,我只想保留客户属于不同组的行。以下是我的尝试:

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
在原始数据帧中出现三次:在组
A
中出现两次,在组
B
中出现一次。由于它属于两个不同的组(
A
B
),因此我不想删除此客户的任何行。也就是说,我要寻找的输出如下:

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

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

使用
groupby
transform
作为一个系列提供唯一的计数,然后只需使用大于1的值进行过滤:

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

与for
系列
一起使用,具有与原始数据帧相同的大小,因此可能对不相等的
1
行进行筛选:

df = df[df.groupby('cus_id')['cus_group'].transform('nunique').ne(1)]
print (df)
  cus_id cus_group
2   5100         A
3   5100         B
6   1630         A
7   1630         A
8   1630         B
详情:

print (df.groupby('cus_id')['cus_group'].transform('nunique'))
0    1
1    1
2    2
3    2
4    1
5    1
6    2
7    2
8    2
Name: cus_group, dtype: int64
或使用:

输出:

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

您可以简单地将keep值更改为first。它会给你想要的结果

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.drop_duplicates(subset = ["cus_id", "cus_group"], keep = "first"))
编辑

对不起,我误解了这个问题


您可以使用
group_by
来识别相同的对象,然后使用transform as
nunique
来提供结果

它还与
过滤器
复制的
任何

df.groupby('cus_id').filter(lambda x: (~x.cus_group.duplicated(keep=False)).any())

Out[510]:
  cus_id cus_group
2  5100   A
3  5100   B
6  1630   A
7  1630   A
8  1630   B

这并没有提供所需的输出我很糟糕,我没有看到“不同”组的客户。我以为只有删除副本。
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.drop_duplicates(subset = ["cus_id", "cus_group"], keep = "first"))
df.groupby('cus_id').filter(lambda x: (~x.cus_group.duplicated(keep=False)).any())

Out[510]:
  cus_id cus_group
2  5100   A
3  5100   B
6  1630   A
7  1630   A
8  1630   B