我想使用for循环更改数据框的顺序,但它不起作用。我的代码如下:
import pandas as pd
df1 = pd.DataFrame({'a':1, 'b':2}, index=1)
df2 = pd.DataFrame({'c':3, 'c':4}, index=1)
for df in [df1, df2]:
df = df.loc[:, df.columns.tolist()[::-1]]
然后df1和df2的列顺序不会改变。
答案 0 :(得分:2)
您可以使用带有列表理解的链分配,即
cmd
答案 1 :(得分:0)
注意:在我的回答中,我试图建立起来,表明使用字典存储datafrmes是一般情况下的最佳方式。如果您想要改变原始数据帧变量,@ Bharath答案是要走的路。
回答:
代码不起作用,因为您没有分配回数据帧列表。以下是解决这个问题的方法:
import pandas as pd
df1 = pd.DataFrame({'a':1, 'b':2}, index=[1])
df2 = pd.DataFrame({'c':3, 'c':4}, index=[1])
l = [df1, df2]
for i, df in enumerate(l):
l[i] = df.loc[:, df.columns.tolist()[::-1]]
所以不同之处在于,我使用enumerate
进行迭代以获取数据集及其在列表中的索引,然后将更改后的数据帧分配给列表中的原始位置。
执行详细信息:
在应用更改之前:
In [28]: for i in l:
...: print(i.head())
...:
a b
1 1 2
c
1 4
In [29]: for i, df in enumerate(l):
...: l[i] = df.loc[:, df.columns.tolist()[::-1]]
...:
应用更改后:
In [30]: for i in l:
...: print(i.head())
...:
b a
1 2 1
c
1 4
改进建议:
使用字典最好如下:
import pandas as pd
d= {}
d['df1'] = pd.DataFrame({'a':1, 'b':2}, index=[1])
d['df2'] = pd.DataFrame({'c':3, 'c':4}, index=[1])
for i,df in d.items():
d[i] = df.loc[:, df.columns.tolist()[::-1]]
然后,您将能够从字典中引用您的数据帧。例如d['df1']
答案 2 :(得分:0)
您可以反转列和值:
import pandas as pd
df1 = pd.DataFrame({'a':1, 'b': 2}, index=[1])
df2 = pd.DataFrame({'c':3, 'c': 4}, index=[1])
print('before')
print(df1)
for df in [df1, df2]:
df.values[:,:] = df.values[:, ::-1]
df.columns = df.columns[::-1]
print('after')
print(df1)
df1
输出:
before
a b
1 1 2
after
b a
1 2 1