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

如何在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]
})

你的核心需求:

  1. 计算DataFrame每一列的中位数
  2. 对每个元素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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 13:45:27