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

使用Pandas apply处理对称DataFrame时,无法忽略对角线单元格的问题

问题分析与解决方案

你的代码出现问题主要有两个核心原因:

  1. 对apply处理的Series索引使用错误,二维索引语法不适用于一维Series
  2. 未将apply的计算结果赋值回原DataFrame,导致原表未被更新

修正后的代码(基于apply方式)

import pandas as pd
import numpy as np
from scipy import stats

# 假设sports_team_performance()为已定义函数
adf = sports_team_performance().head(100)
sports = ['NFL', 'NBA', 'NHL', 'MLB']
ans = pd.DataFrame({k: np.nan for k in sports}, index=sports)

def p_map(row):
    # row.name为当前处理的行索引(如NFL)
    for col in sports:
        if row.name == col:
            continue  # 跳过对角线,保留NaN
        # 计算行索引对应列与当前列的配对t检验p值
        p_val = stats.ttest_rel(adf[row.name], adf[col], nan_policy='omit')[1]
        row.loc[col] = p_val
    return row

# 将apply的结果赋值回ans,完成更新
ans = ans.apply(p_map, axis=1)

更高效的替代方案(双重循环)

如果数据量不大,直接使用双重循环会更直观,避免apply的潜在问题:

import pandas as pd
import numpy as np
from scipy import stats

adf = sports_team_performance().head(100)
sports = ['NFL', 'NBA', 'NHL', 'MLB']
ans = pd.DataFrame(np.nan, index=sports, columns=sports)

for idx in sports:
    for col in sports:
        if idx == col:
            continue
        # 直接赋值对应位置的p值
        ans.loc[idx, col] = stats.ttest_rel(adf[idx], adf[col], nan_policy='omit')[1]

关键修复点说明

  • 移除错误的二维索引row.loc[row.name, x],改用一维索引row.loc[col]操作Series
  • 将apply的返回值重新赋值给ans,确保原DataFrame被更新
  • 明确配对t检验的参数顺序,保证ans.loc[index, column]对应adf[index]与adf[column]的检验结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:22:03