Pandas DataFrame分组过滤:筛选无主账户的用户分组
如何在Pandas中过滤掉包含特定条件的分组
你想要按User分组后,仅保留**没有任何主账户(即组内无primary为yes的行)**的用户的所有数据,这里有两种高效的实现方式:
方法一:使用groupby.filter()直接过滤分组
groupby.filter()方法可以直接对每个分组应用判断条件,只保留符合条件的分组数据,代码如下:
import pandas as pd # 读取你的数据 df = pd.read_csv("accounts_test.csv") # 按User分组,过滤掉组内存在primary="yes"的分组 filtered_df = df.groupby('User').filter(lambda group: (group['primary'] != 'yes').all()) # 查看结果 print(filtered_df)
代码解释:
lambda group: (group['primary'] != 'yes').all():对每个分组group进行判断,检查该分组中所有行的primary都不等于yes(因为NaN != 'yes'会返回True,所以不会影响判断)。- 只有满足这个条件的分组,其所有行才会被保留到最终的
filtered_df中。
方法二:先筛选符合条件的用户,再提取数据
如果你想更清晰地看到哪些用户符合条件,可以先筛选出目标用户列表,再从原DataFrame中提取对应数据:
import pandas as pd df = pd.read_csv("accounts_test.csv") # 计算每个User是否满足“无主账户”的条件 user_validity = df.groupby('User').apply(lambda group: (group['primary'] != 'yes').all()) # 提取符合条件的User ID valid_users = user_validity[user_validity].index # 筛选出这些User的所有数据 filtered_df = df[df['User'].isin(valid_users)] print(filtered_df)
代码解释:
- 第一步通过
groupby.apply()得到每个用户的有效性标记(True表示该用户无主账户); - 第二步从标记中提取出
True对应的User ID; - 最后用
isin()筛选原DataFrame中属于这些User的所有行。
两种方法最终都会得到你期望的输出:
User primary account_type 3 2 NaN current_acc 4 2 NaN invest 5 2 NaN savings 9 4 NaN savings 10 4 NaN invest 11 4 NaN current_acc
内容的提问来源于stack exchange,提问作者jonathan müller
相关产品推荐
相关产品推荐

