循环数据帧

时间:2017-11-23 13:38:35

标签: pandas dataframe

我想使用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的列顺序不会改变。

3 个答案:

答案 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