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

使用For循环更新多个Pandas DataFrame时无法覆盖原数据的问题

问题描述

编写的for循环能正确执行操作,但无法将结果覆盖到原Pandas DataFrame中。以修改列名的循环为例:

示例初始数据:

TimeStamp [µs] Source Channel Label Value [pV]
0              402600                  F10          0
1              402700                  F10          0
2              402800                  F10          0
3              402900                  F10          0
4              403000                  F10    -149012
              ...                  ...        ...
845142      299700800                  G10          0
845143      299700900                  G10          0
845144      299701000                  G10          0
845145      299701100                  G10          0
845146      299701200                  G10          0

操作步骤:

  1. 创建包含目标DataFrame的列表:
list_dataset = [week6_233C, week6_233R, week6_233V, week6_401C, week6_401R, week6_401V, week5_233C, week5_233R, week5_233V]
  1. 编写for循环修改列名:
for i in list_dataset:
    i = i.rename(columns={'TimeStamp [µs]': 'Time', 'Source Channel Label': 'Electrode', \
                                            'Value [pV]': 'pV'})
    print(i)

循环能打印出预期的修改后结果:

Time Electrode       pV
0          1906200        F7        0
1          1906300        F7        0
2          1906400        F7        0
3          1906500        F7  -149012
4          1906600        F7  -149012
           ...       ...      ...
1621073  300018100        G8        0
1621074  300018200        G8        0
1621075  300018300        G8        0
1621076  300018400        G8        0
1621077  300018500        G8        0

但原DataFrame(如week6_233C)并未更新,仍保持初始样式。单独执行week6_233C = week6_233C.rename(columns=...)能更新原DataFrame,但循环中无法实现,需解决该问题。

解决方法

问题根源

Pandas的rename()方法默认返回新的DataFrame对象,而非修改原对象。循环中i = i.rename(...)仅将局部变量i指向了新对象,并未修改列表中存储的原DataFrame引用,也未更新原变量(如week6_233C)指向的对象。

方案1:使用inplace=True直接修改原对象

此方法会在原DataFrame上直接执行修改,无需创建新对象,原变量和列表中的元素会同步更新:

for i in list_dataset:
    i.rename(
        columns={
            'TimeStamp [µs]': 'Time',
            'Source Channel Label': 'Electrode',
            'Value [pV]': 'pV'
        },
        inplace=True
    )

方案2:遍历索引更新列表并重新赋值原变量

若不想使用inplace(部分场景下inplace可能引发副作用),可通过索引将修改后的新DataFrame替换列表中的旧元素,再重新赋值给原变量:

columns_mapping = {
    'TimeStamp [µs]': 'Time',
    'Source Channel Label': 'Electrode',
    'Value [pV]': 'pV'
}

# 更新列表中的元素为修改后的DataFrame
for idx, df in enumerate(list_dataset):
    list_dataset[idx] = df.rename(columns=columns_mapping)

# 将更新后的列表元素重新赋值给原变量
week6_233C, week6_233R, week6_233V, week6_401C, week6_401R, week6_401V, week5_233C, week5_233R, week5_233V = list_dataset

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 11:28:26