You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

代码说明

  1. 第一步分组时,通过lambda x: (x == 'yes').any()判断每个Name对应的组内是否存在至少一个'yes',得到每个Name的有效状态。
  2. 筛选出有效记录后,再次按Status分组:用nunique()统计该Status下符合条件的Name数量,用, .join拼接Name列表。
  3. 最后通过循环输出你需要的格式。

内容的提问来源于stack exchange,提问作者rainy days.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 11:15:37