我正在使用具有以下结构的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中出现了三次:在组A中出现了两次,在组B中出现了一次。因为它属于两个不同的组(A和B),所以我不想为这个客户删除任何行。也就是说,我要寻找的输出如下:
cus_id cus_group
2 5100 A
3 5100 B
6 1630 A
7 1630 A
8 1630 B我不知道为了实现我的目标,我缺少了哪些功能。任何额外的帮助都将不胜感激。
发布于 2019-09-20 07:25:16
将DataFrameGroupBy.nunique与GroupBy.transform一起用于与原始DataFrame相同大小的Series,因此可能由boolean indexing对不相等的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发布于 2019-09-20 07:24:58
使用groupby和transform作为nunique --这会将唯一的计数作为一个系列,然后只需过滤大于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发布于 2019-09-20 07:25:51
或者使用pandas.DataFrame.groupby.filter
df.groupby('cus_id').filter(lambda x: x['cus_group'].nunique()>1)输出:
cus_group cus_id
2 A 5100
3 B 5100
6 A 1630
7 A 1630
8 B 1630https://stackoverflow.com/questions/58023598
复制相似问题