Python 基于组筛选数据帧行
我正在使用具有以下结构的数据帧学习Python/Pandas: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)
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 asnunique
来提供结果 它还与过滤器
、复制的
和任何
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