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来求和,需要修改参数:
这种情况下,有缺失值的组求和结果会是NaN,而sum_series = df.groupby('user_id')['total_play_seconds'].sum(skipna=False)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
相关产品推荐
相关产品推荐

