for 循环中对 pandas 数据框的更改仅部分保存

Changes to pandas dataframe in for loop is only partially saved

我有两个 df,想用 for 循环以某种方式操作它们。

我发现在循环中创建一个新列会更新 df。但不适用于 set_index 等其他命令或删除列。

import pandas as pd
import numpy as np

gen1 = pd.DataFrame(np.random.rand(12,3))
gen2 = pd.DataFrame(np.random.rand(12,3))

df1 = pd.DataFrame(gen1)
df2 = pd.DataFrame(gen2)


all_df = [df1, df2]

for x in all_df:
    x['test'] = x[1]+1
    x = x.set_index(0).drop(2, axis=1)
    print(x)

请注意,当每个 df 都按循环打印时,两个 df 都完美地执行了所有命令。但是当我之后调用 df 时,只有新列 'test' 在那里,并且 'set_index' 和 'drop' 列被撤消。

我是否遗漏了一些关于为什么只有一个命令被永久化的信息?谢谢。

这是正在发生的事情:

x 是一个变量,在 for 循环的每次迭代开始时,它最初引用列表 all_df 中的一个元素。当您分配给 x['test'] 时,您正在使用 x 来更新该元素,因此它会执行您想要的操作。

但是,当您将新内容分配给 x 时,您只是让 x 引用该新内容而没有触及 x 之前引用的内容(即,您希望更改的 all_df 元素)。

您可以试试这样的方法:

for x in all_df:
    x['test'] = x[1]+1
    x.set_index(0, inplace=True)
    x.drop(2, axis=1, inplace=True)

print(df1)
print(df2)

请注意,通常不鼓励使用 inplace(例如,参见 ),因此您可能需要考虑是否可以使用新的 DataFrame 对象来实现 objective基于 df1df2.

创建