使用Pandas apply处理对称DataFrame时,无法忽略对角线单元格的问题
问题分析与解决方案
你的代码出现问题主要有两个核心原因:
- 对
apply处理的Series索引使用错误,二维索引语法不适用于一维Series - 未将
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
相关产品推荐
相关产品推荐

