Pandas DataFrame groupby分组统计报错求助:按Status统计符合条件的Name
解决方法
错误原因
你当前的代码错误在于,直接将DataFrame['Activity'].eq('yes')作为参数传给sum()/any()等聚合方法——这些聚合方法不需要额外传入Series参数,正确的做法是先对列进行判断,再对分组后的结果调用聚合方法。
修正后的代码
以下是实现需求的完整代码:
import pandas as pd # 构造示例数据集 data = { 'Name': ['Jane', 'John', 'Elle', 'Chris', 'John', 'Clay'], 'Status': ['student', 'businessman', 'student', 'policeman', 'businessman', 'businessman'], 'Activity': ['yes', 'yes', 'no', 'yes', 'no', 'yes'] } df = pd.DataFrame(data) # 1. 按Name+Status分组,判断每个Name是否至少有一条Activity='yes' has_yes = df.groupby(['Name', 'Status'])['Activity'].apply(lambda x: (x == 'yes').any()).reset_index() # 2. 筛选出符合条件的记录 filtered = has_yes[has_yes['Activity']] # 3. 按Status分组,统计数量并拼接Name列表 result = filtered.groupby('Status').agg( count=('Name', 'nunique'), names=('Name', ', '.join) ).reset_index() # 按需求格式输出 for _, row in result.iterrows(): print(f"{row['Status']} {row['count']} {row['names']}")
输出结果
student 1 Jane businessman 2 John, Clay policeman 1 Chris
代码说明
- 第一步分组时,通过
lambda x: (x == 'yes').any()判断每个Name对应的组内是否存在至少一个'yes',得到每个Name的有效状态。 - 筛选出有效记录后,再次按Status分组:用
nunique()统计该Status下符合条件的Name数量,用,.join拼接Name列表。 - 最后通过循环输出你需要的格式。
内容的提问来源于stack exchange,提问作者rainy days.
相关产品推荐
相关产品推荐

