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

如何快速替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:47:45