首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于组的DataFrame行过滤

基于组的DataFrame行过滤
EN

Stack Overflow用户
提问于 2019-09-20 07:21:00
回答 5查看 89关注 0票数 4

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

代码语言:javascript
复制
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的行。具体来说,我只想保留客户属于不同组的行。以下是我的尝试:

代码语言:javascript
复制
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中出现了一次。因为它属于两个不同的组(AB),所以我不想为这个客户删除任何行。也就是说,我要寻找的输出如下:

代码语言:javascript
复制
  cus_id cus_group
2   5100         A
3   5100         B
6   1630         A
7   1630         A
8   1630         B

我不知道为了实现我的目标,我缺少了哪些功能。任何额外的帮助都将不胜感激。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2019-09-20 07:25:16

DataFrameGroupBy.nuniqueGroupBy.transform一起用于与原始DataFrame相同大小的Series,因此可能由boolean indexing对不相等的1行进行筛选:

代码语言:javascript
复制
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

详细信息:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2019-09-20 07:24:58

使用groupbytransform作为nunique --这会将唯一的计数作为一个系列,然后只需过滤大于1的值:

代码语言:javascript
复制
df[df.groupby('cus_id')['cus_group'].transform('nunique')>1]

代码语言:javascript
复制
  cus_id cus_group
2   5100         A
3   5100         B
6   1630         A
7   1630         A
8   1630         B
票数 1
EN

Stack Overflow用户

发布于 2019-09-20 07:25:51

或者使用pandas.DataFrame.groupby.filter

代码语言:javascript
复制
df.groupby('cus_id').filter(lambda x: x['cus_group'].nunique()>1)

输出:

代码语言:javascript
复制
  cus_group cus_id
2         A   5100
3         B   5100
6         A   1630
7         A   1630
8         B   1630
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58023598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档