设置熊猫数据框中列的顺序

有没有一种方法可以根据我的个人喜好重新排列熊猫数据框中的列(即不是按字母或数字排序,而更像是遵循某些约定) ?

举个简单的例子:

frame = pd.DataFrame({
'one thing':[1,2,3,4],
'second thing':[0.1,0.2,1,2],
'other thing':['a','e','i','o']})

产生了这个:

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

但相反,我希望这样:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(请提供一个通用的解决方案,而不是特定的情况下。非常感谢。)

277933 次浏览

只要输入列名就可以自己选择顺序。注意双括号:

frame = frame[['column I want first', 'column I want second'...etc.]]

您也可以执行类似 df = df[['x', 'y', 'a', 'b']]的操作

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

此外,您还可以使用以下命令获得列列表:

cols = list(df.columns.values)

产出将产生如下结果:

['x', 'y', 'a', 'b']

这样就很容易手动重新排列。

你也可以使用 OrderedDect:

In [183]: from collections import OrderedDict


In [184]: data = OrderedDict()


In [185]: data['one thing'] = [1,2,3,4]


In [186]: data['second thing'] = [0.1,0.2,1,2]


In [187]: data['other thing'] = ['a','e','i','o']


In [188]: frame = pd.DataFrame(data)


In [189]: frame
Out[189]:
one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

使用列表而不是字典构造它

frame = pd.DataFrame([
[1, .1, 'a'],
[2, .2, 'e'],
[3,  1, 'i'],
[4,  4, 'o']
], columns=['one thing', 'second thing', 'other thing'])


frame


one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o

你可以用这个:

columnsTitles = ['onething', 'secondthing', 'otherthing']


frame = frame.reindex(columns=columnsTitles)

添加“ column”参数:

frame = pd.DataFrame({
'one thing':[1,2,3,4],
'second thing':[0.1,0.2,1,2],
'other thing':['a','e','i','o']},
columns=['one thing', 'second thing', 'other thing']
)

尝试建立索引(所以你想要的不仅仅是一个通用的解决方案,所以索引顺序可以是你想要的) :

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

现在:

print(frame)

是:

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

我发现这是最直接有效的方法:

df = pd.DataFrame({
'one thing':[1,2,3,4],
'second thing':[0.1,0.2,1,2],
'other thing':['a','e','i','o']})


df = df[['one thing','second thing', 'other thing']]

这里有一个我经常使用的解决方案。当您拥有一个包含大量列的大型数据集时,您肯定不希望手动重新排列所有列。

您可以并且最有可能想要做的就是将您经常使用的前几列排序,并让所有其他列保持不变。这是在 R。 df %>%select(one, two, three, everything())中常用的方法

因此,可以首先手动键入要排序的列,并将其放在列表 cols_to_order中所有其他列之前。

然后,通过组合其余列,为新列构造一个列表:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

在此之后,您可以按照其他解决方案的建议使用 new_columns

import pandas as pd
frame = pd.DataFrame({
'one thing': [1, 2, 3, 4],
'other thing': ['a', 'e', 'i', 'o'],
'more things': ['a', 'e', 'i', 'o'],
'second thing': [0.1, 0.2, 1, 2],
})


cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]


one thing  second thing other thing more things
0          1           0.1           a           a
1          2           0.2           e           e
2          3           1.0           i           i
3          4           2.0           o           o

即使这是一个老问题,你也可以使用 lociloc:

frame = frame.loc[:, ['column I want first', 'column I want second', "other thing"]]


frame = frame.iloc[:, [1, 3, 2]]
df = df.reindex(columns=["A", "B", "C"])