如何快速替换Pandas DataFrame中的指定值并支持扩展至任意多行多列?
解决方案:动态替换DataFrame值(支持任意行列扩展)
嘿,我来帮你搞定这个需求!先看一下你创建的DataFrame和替换规则,其实这里面藏着一个通用的规律——每个需要替换的单元格值 = 对应行的Sum × 对应列的Sum ÷ 右下角的总Sum,利用这个规律我们可以写出完全支持任意行数、列数的最简代码,不用一个个手动映射值。
先回顾你的初始DataFrame
import pandas as pd import numpy as np # 创建初始DataFrame df = pd.DataFrame({'A':[1,2], 'B':[3,4]}, index=['1','2']) df.loc[:,'Sum'] = df.sum(axis=1) df.loc['Sum'] = df.sum(axis=0) print(df)
输出:
A B Sum 1 1 3 4 2 2 4 6 Sum 3 7 10
最简实现代码(支持任意行列扩展)
# 提取行总和(排除最后一行的Sum行) row_sums = df['Sum'].iloc[:-1] # 提取列总和(排除最后一列的Sum列) col_sums = df.loc['Sum', :].iloc[:-1] # 计算行总和与列总和的外积,再除以右下角的总Sum值 df.iloc[:-1, :-1] = np.outer(row_sums, col_sums) / df.loc['Sum', 'Sum'] print(df)
执行后输出:
A B Sum 1 1.2 2.8 4 2 1.8 4.2 6 Sum 3.0 7.0 10
完美匹配你的替换规则:
- 原1 → 3×4/10 = 1.2
- 原2 → 3×6/10 = 1.8
- 原3 → 4×7/10 = 2.8
- 原4 → 7×6/10 = 4.2
扩展性说明
这个方法完全不依赖固定的行数和列数:
iloc[:-1, :-1]自动定位所有需要替换的单元格(排除最后一行Sum和最后一列Sum)row_sums和col_sums动态提取当前DataFrame的行、列总和- 外积运算
np.outer会自动根据行、列总和的长度生成对应维度的替换矩阵
哪怕你后续把DataFrame扩展成5行8列,只要保持最后一行是行总和、最后一列是列总和的结构,这段代码直接就能用,不用做任何修改。
内容的提问来源于stack exchange,提问作者Samuel
相关产品推荐
相关产品推荐

