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

基于DataFrame中reaction列值批量修改行数据失败求助

解决大型DataFrame按reaction列批量乘常数的问题

嘿,你遇到的这个问题我太熟了!核心原因是**iterrows()返回的是每行的临时副本**,不是原DataFrame的引用——你在循环里改row[2:]其实只是改了个“假行”,根本不会影响原数据。而且对于大型DataFrame来说,iterrows()的效率极低,完全没必要用它,咱们用pandas原生的批量操作来搞定,既快又准。

第一步:先整理反应与常数的映射表

先把每个reaction对应的常数做成字典,后续代码会简洁很多,也方便维护:

reaction_factor_map = {
    '152Gd-p': 0.002,
    '154Gd-p': 0.0218,
    '155Gd-p': 0.148,
    '156Gd-p': 0.2047,
    '157Gd-p': 0.1565,
    '158Gd-p': 0.2484,
    '160Gd-p': 0.2186
}

第二步:高效批量修改数据(推荐两种方法)

方法一:用map+multiply(最简洁高效,优先选这个)

先把需要修改的数值列(也就是前两列之后的所有列)提出来,然后用reaction列映射到对应的常数,再逐行相乘:

# 提取要处理的数值列:排除前两列(reaction和product)
numeric_cols = df_trial.columns[2:]

# 批量对数值列按对应常数相乘
df_trial[numeric_cols] = df_trial[numeric_cols].multiply(
    df_trial['reaction'].map(reaction_factor_map),
    axis=0
)

这个方法是纯向量操作,比循环快N倍,完全适配大型DataFrame。

方法二:用loc按条件批量赋值(适合需要额外逻辑的场景)

如果之后需要给某些reaction加特殊处理,用loc定位行再赋值也很方便:

for reaction, factor in reaction_factor_map.items():
    # 定位对应reaction的行,然后给数值列乘常数
    df_trial.loc[df_trial['reaction'] == reaction, numeric_cols] *= factor

这个方法也是批量操作,比iterrows()高效太多。

为啥你的原代码没效果?

再给你解释下:当你用for index, row in df_trial.iterrows()时,row是原DataFrame行的副本,你修改row[2:]只是改了这个临时副本,根本没写回原DataFrame。如果非要用iterrows(真的不推荐大型数据),得手动把修改后的行赋值回去:

for index, row in df_trial.iterrows():
    # 从映射表拿常数,找不到就乘1(避免报错)
    factor = reaction_factor_map.get(row['reaction'], 1)
    df_trial.loc[index, numeric_cols] = row[numeric_cols] * factor

但还是强烈建议用前面的批量方法,速度差不是一点半点。

验证修改结果

改完之后可以用下面的代码检查下,比如看看155Gd-p的行是不是被正确乘以0.148了:

print(df_trial[df_trial['reaction'] == '155Gd-p'].head())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:22:24