Python 重新排序列似乎在一个循环中工作,但不';T我到底错过了什么?

Python 重新排序列似乎在一个循环中工作,但不';T我到底错过了什么?,python,pandas,loops,dataframe,Python,Pandas,Loops,Dataframe,所以我完全不明白为什么会这样: 我有8个不同的数据帧,具有相同的列。我想重新排列所有列上的列。因此,我创建了一个列表并尝试了以下方法: original_cols = [1, 48, 49, 50, 51, 52] new_cols = [48, 49, 50, 51, 52, 1] list_of_dfs = [df1, df2, df3...., df8] for df in list_of_dfs: df = df[new_cols] 当我查看任何一个数据帧时,我仍然得到旧的

所以我完全不明白为什么会这样:

我有8个不同的数据帧,具有相同的列。我想重新排列所有列上的列。因此,我创建了一个列表并尝试了以下方法:

original_cols = [1, 48, 49, 50, 51, 52]
new_cols = [48, 49, 50, 51, 52, 1]

list_of_dfs = [df1, df2, df3...., df8]

for df in list_of_dfs:
    df = df[new_cols]
当我查看任何一个数据帧时,我仍然得到旧的列顺序,为什么?我插入了一个print语句,如下所示,循环执行我想要的操作:

for df in list_of_dfs:
    print (df.columns.tolist())
    df = df[new_cols]
    print (df.columns.tolist())

Output (for df1):
[1, 48, 49, 50, 51, 52]
[48, 49, 50, 51, 52, 1]
我可以手动写出所有的内容,但我认为一个简单的循环会更好,但无法让它工作。我一定是对循环之类的东西缺乏基本的了解。非常感谢您的帮助

当前解决方案:

df1 = df1[new_cols]
df2 = df2[new_cols]
.
.
```


当您分配
df=df[new\u cols]
时,它不会更新列表中的数据帧。试试这个:

size_ = len(list_of_dfs)
for idx in range(size_):
    list_of_dfs[idx] = list_of_dfs[idx][new_cols]

现在idx将在dfs的列表中表示一个索引位置,您只需更新每个索引处的DataFrame列即可

当您分配
df=df[new\u cols]
时,它不会更新列表中的数据帧。试试这个:

size_ = len(list_of_dfs)
for idx in range(size_):
    list_of_dfs[idx] = list_of_dfs[idx][new_cols]

现在idx将在dfs的列表中表示一个索引位置,您只需更新每个索引处的DataFrame列即可

您指的是
DataFrame
对象的副本。如果需要在全局范围内交换变量名(不推荐),可以使用
globals
引用对象本身

import re
for df in [name for name in globals() if re.findall('df\d+', name)]:
    globals()[df] = globals()[df][new_cols]

您指的是
DataFrame
对象的副本。如果需要在全局范围内交换变量名(不推荐),可以使用
globals
引用对象本身

import re
for df in [name for name in globals() if re.findall('df\d+', name)]:
    globals()[df] = globals()[df][new_cols]

当您使用dfs的列表中的df的
开始迭代时,df指的是列表中的一个元素。当您执行
df=df[new\u cols]
时,您将创建一个名为df的新变量,该变量与该列表的第一个元素无关。在第二次迭代中,这将再次被覆盖,然后再次被覆盖。请参阅以了解名称在Python中的工作方式。当您在dfs的列表中使用df的
开始迭代时,df指的是列表中的一个元素。当您执行
df=df[new\u cols]
时,您将创建一个名为df的新变量,该变量与该列表的第一个元素无关。在第二次迭代中,这将再次被覆盖,然后再次被覆盖。请查看名称在Python中的工作方式。仍然不工作。我写的和你写的一模一样,当循环中的列被重新排序时,dfs在循环结束后不会更新。我还遗漏了什么?哦,我知道您希望能够使用更新的值在列表之外调用df,df1,这在以前是不清楚的,但是列表中不包含原始的
数据帧,而是一个副本。我认为你不能用一个列表(我知道)来完成这个功能。如果您注意到您的
dfs列表已更新为正确的列值,并且您可以通过索引访问给定的
数据帧。仍然不工作。我写的和你写的一模一样,当循环中的列被重新排序时,dfs在循环结束后不会更新。我还遗漏了什么?哦,我知道您希望能够使用更新的值在列表之外调用df,df1,这在以前是不清楚的,但是列表中不包含原始的
数据帧,而是一个副本。我认为你不能用一个列表(我知道)来完成这个功能。如果您注意到您的
dfs列表已使用正确的列值进行更新,并且您可以通过索引访问给定的
数据帧。必须有一种方法通过循环对df对象执行此操作,而不是像我现在所做的那样多次重复(键入)本质上相同的操作。是的,正如你所提到的,我不想搞乱任何全局操作。必须有一种方法通过循环对df对象执行此操作,而不是像我现在所做的那样多次重复(键入)本质上相同的操作。