计算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)
问题根源
- 提前终止函数:
return语句写在循环内部,第一次循环计算完中位数后直接返回结果,函数终止,后续列的循环无法执行。 - 列索引遗漏:
range(1, x.shape[1])从索引1开始遍历,漏掉了第一列(索引0),导致第一列的中位数未被正确计算。 - 冗余转换:
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
相关产品推荐
相关产品推荐

