使用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
操作步骤:
- 创建包含目标DataFrame的列表:
list_dataset = [week6_233C, week6_233R, week6_233V, week6_401C, week6_401R, week6_401V, week5_233C, week5_233R, week5_233V]
- 编写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
相关产品推荐
相关产品推荐

