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

Pandas分组求和后求中位数问题:代码为何无法通过课程验证?

排查分组求和后中位数计算错误的可能原因

嘿,我来帮你梳理下可能导致结果不符合课程预期的问题!你的代码思路逻辑上是通顺的,但有几个细节可能没注意到,咱们一步步来看:

1. 先排除无关步骤:排序是多余的,但不是错误根源

你代码里的sort_values('user_id')其实完全没必要——Pandas的groupby()默认会自动按分组键(这里是user_id)排序,所以这步不会影响最终的求和或中位数结果,可以直接删掉,但这不是导致错误的原因。

2. 最可能的问题:数据缺失或分组键类型异常

这是最常见的踩坑点:

  • user_id存在缺失值:如果有些行的user_id是NaN,groupby默认会自动排除这些行的分组(dropna=True是默认参数)。如果课程预期要把缺失的user_id也当成一个组来计算求和,那你需要修改groupby的参数:
    sum_series = df.groupby('user_id', dropna=False)['total_play_seconds'].sum()
    
  • user_id数据类型不对:比如user_id是字符串类型(比如"123"),但实际应该是数值类型(123),这会导致本应属于同一个用户的行被分成不同组(比如"0123"和"123"会被当成两个用户)。你可以用df['user_id'].dtype查看类型,必要时转换:
    df['user_id'] = df['user_id'].astype(int)  # 如果是字符串转数值
    
  • total_play_seconds存在缺失值:sum()默认会忽略NaN值(skipna=True),如果课程要求把缺失的total_play_seconds当成0来求和,需要修改参数:
    sum_series = df.groupby('user_id')['total_play_seconds'].sum(skipna=False)
    
    这种情况下,有缺失值的组求和结果会是NaN,而median()默认会忽略NaN,这也会导致最终中位数和预期不符。

3. 中位数计算的算法差异

Pandas的median()默认使用method='linear'来计算中位数(当数据量为偶数时,取中间两个数的平均值),但有些课程可能要求使用其他算法(比如取中间两个数的较小值、较大值等)。你可以尝试指定不同的方法:

# 比如取中间位置的较小值
median_new = df.groupby('user_id')['total_play_seconds'].sum().median(method='lower')

其他可选的method参数有'higher'、'midpoint'、'nearest',你可以对照课程要求尝试。

4. 快速排查数据的小技巧

可以先运行以下代码快速检查数据是否有异常:

# 检查user_id的缺失情况和类型
print("user_id缺失数:", df['user_id'].isna().sum())
print("user_id数据类型:", df['user_id'].dtype)

# 检查total_play_seconds的缺失情况
print("total_play_seconds缺失数:", df['total_play_seconds'].isna().sum())

# 查看分组后的求和结果前10行,确认是否符合预期
print(df.groupby('user_id')['total_play_seconds'].sum().head(10))

内容的提问来源于stack exchange,提问作者Nckh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 13:42:49