如何在DataFrame各列循环对元素应用基于列中位数的函数?
解决方法
首先明确你的DataFrame结构:
import pandas as pd bb = pd.DataFrame({ 'A': [0.5, 1.7, 3.2], 'B': [5, 2.1, 4], 'C': [2.3, 4.5, 8.5], 'D': [1.7, 2.5, 7.9] })
你的核心需求:
- 计算DataFrame每一列的中位数
- 对每个元素
x,计算abs(x - 对应列中位数)的中位数(注:单个数值的中位数就是它本身,因此这一步等价于直接计算元素与列中位数的绝对值)
你的代码问题
bb.iteritems()返回(列名, 列Series)元组,col[1:]写法错误,应直接遍历col[1](即列的Series数据)medianx未定义,缺少先计算每列中位数的步骤- 三层嵌套循环冗余,完全没必要
正确实现方式
方法一:Pandas内置高效实现
# 1. 计算每列中位数 col_medians = bb.median() # 2. 批量计算每个元素与对应列中位数的绝对值 mad_df = bb.sub(col_medians).abs() # 若需要转为列表格式(和你原代码的mad列表一致) mad_list = mad_df.values.flatten().tolist()
方法二:修正循环写法
如果偏好循环实现,可按以下方式调整:
from statistics import median mad = [] # 先预存每列的中位数 col_medians = {col: bb[col].median() for col in bb.columns} for col_name, col_data in bb.iteritems(): col_median = col_medians[col_name] for x in col_data: # 单值的中位数就是自身,直接计算绝对值即可 zz = median([abs(x - col_median)]) mad.append(zz)
结果示例
以你的DataFrame为例,各列中位数为:
- A列:1.7
- B列:4
- C列:4.5
- D列:2.5
最终得到的结果DataFrame如下:
A B C D 0 1.2 1.0 2.2 0.8 1 0.0 1.9 0.0 0.0 2 1.5 0.0 4.0 5.4
内容的提问来源于stack exchange,提问作者pino
相关产品推荐
相关产品推荐

