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

计算Pandas DataFrame中位数时,函数内FOR循环仅执行首次迭代

问题描述

编写用于计算任意数据中位数的construct_frame函数时,遇到以下问题:遍历Pandas DataFrame列的FOR循环仅执行第一次迭代,无任何报错信息。函数本该返回10列的中位数结果,但实际仅输出第一列的结果(输出内容为:1、34.26)。

原代码如下:

def construct_frame(x):
    
    '''constructor function to get median of any data'''

    if x.shape[1]>=0:
        for i in range(1,(x.shape[1])):
            print(i)
            x_ser = x.iloc[:,i].sort_values(ignore_index=True)                 #sorting values in descending order

            x_ser_new= pd.Series(x_ser)

    #             print(x_ser)
    #             print(len(x_ser))
    #             print(type(x_ser))
    #             print(x_ser.dtypes)
    #             print(x_ser.shape[0])


            if len(x_ser_new)% 2==0:                                       #checking length of data if 'even'

                res = (x_ser_new[len(x_ser_new)//2]+ x_ser_new[(len(x_ser_new)//2)-1])/2   # nth column and (n-1)th column average
                return res 

            else:                                                      # if length of data is 'odd'

                res = x_ser_new[len(x_ser_new)//2]                             # nth column 

                return res



construct_frame(df)
问题根源
  1. 提前终止函数:return语句写在循环内部,第一次循环计算完中位数后直接返回结果,函数终止,后续列的循环无法执行。
  2. 列索引遗漏:range(1, x.shape[1])从索引1开始遍历,漏掉了第一列(索引0),导致第一列的中位数未被正确计算。
  3. 冗余转换:x.iloc[:,i].sort_values(...)返回的已是Series类型,无需再用pd.Series(x_ser)重复转换。
修复后的代码
import pandas as pd

def construct_frame(x):
    '''计算DataFrame每列的中位数'''
    medians = []
    # 遍历所有列(索引从0开始)
    for i in range(x.shape[1]):
        sorted_ser = x.iloc[:, i].sort_values(ignore_index=True)
        ser_length = len(sorted_ser)
        if ser_length % 2 == 0:
            # 偶数长度取中间两个数的平均值
            median = (sorted_ser[ser_length//2] + sorted_ser[(ser_length//2)-1]) / 2
        else:
            # 奇数长度取中间位置的数
            median = sorted_ser[ser_length//2]
        medians.append(median)
    # 将结果转为带列名的Series,便于对应查看
    return pd.Series(medians, index=x.columns)

# 调用示例
# print(construct_frame(df))
关键修改说明
  • 新增medians列表存储每列的中位数,循环结束后统一返回,避免提前终止函数。
  • 调整循环范围为range(x.shape[1]),覆盖所有列。
  • 移除冗余的Series转换,简化代码。
  • 返回结果转为带列名的Series,直观展示每列对应的中位数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 12:53:29