如何交换两个DataFrame列?

时间:2014-09-03 16:33:24

标签: python pandas

在MATLAB中,要交换表A的第一列和第二列,可以执行此操作 1

A = A(:, [2 1 3:end]);

如果A是大熊猫DataFrame,是否有同样方便的方法呢?

1 MATLAB使用基于1的索引。

11 个答案:

答案 0 :(得分:41)

pandas有reindex方法来做到这一点。您只需按照您希望的顺序列出包含列名称的列表:

columnsTitles=["B","A"]
df=df.reindex(columns=columnsTitles)

干杯

答案 1 :(得分:12)

acushner答案的一个小变种:

# get a list of the columns
col_list = list(df)
# use this handy way to swap the elements
col_list[0], col_list[1] = col_list[1], col_list[0]
# assign back, the order will now be swapped
df.columns = col_list

示例:

In [39]:

df = pd.DataFrame({'a':randn(3), 'b':randn(3), 'c':randn(3)})
df
Out[39]:
          a         b         c
0 -0.682446 -0.200654 -1.609470
1 -1.998113  0.806378  1.252384
2 -0.250359  3.774708  1.100771
In [40]:

col_list = list(df)
col_list[0], col_list[1] = col_list[1], col_list[0]
df.columns = col_list
df
Out[40]:
          b         a         c
0 -0.682446 -0.200654 -1.609470
1 -1.998113  0.806378  1.252384
2 -0.250359  3.774708  1.100771

<强>更新

如果您只是想更改列顺序而不更改列内容,那么您可以使用花式索引重新索引:

In [34]:
cols = list(df)
cols[1], cols[0] = cols[0], cols[1]
cols

Out[34]:
['b', 'a', 'c']

In [35]:
df.ix[:,cols]

Out[35]:
          b         a         c
0 -0.200654 -0.682446 -1.609470
1  0.806378 -1.998113  1.252384
2  3.774708 -0.250359  1.100771

答案 2 :(得分:2)

我终于解决了这个问题:

A = A.iloc[:, [1, 0] + range(2, A.shape[1])]

它远不如MATLAB版本方便,但我喜欢它不需要创建临时变量这一事实。

答案 3 :(得分:1)

c = A.columns
A = A[c[np.r_[1, 0, 2:len(c)]]]

或者,甚至更容易:

A[[c[0], c[1]]] = A[[c[1], c[0]]]

*编辑:根据伊万的建议修复。

答案 4 :(得分:1)

如果您有多列并且性能和内存不是问题,则可以简单地使用此功能:

def swap_columns(df, c1, c2):
    df['temp'] = df[c1]
    df[c1] = df[c2]
    df[c2] = df['temp']
    df.drop(columns=['temp'], inplace=True)

答案 5 :(得分:1)

就我而言,我的数据框中有100多个列。因此,我列出了一个短函数来只切换两列,而不是列出所有列

import * as sinon from "ts-sinon";

const stubObject = sinon.stubObject;

答案 6 :(得分:0)

我会使用:

end = df.shape[1] # or len(df.columns)
df.iloc[:, np.r_[1, 0, 2:end]

答案 7 :(得分:0)

对于python中的数据框,考虑到您已经给出了2列,则:

#df is your data frame

col1='c1'

col2='c2'

df = df[[col1 if col == col2 else col2 if col == col1 else col for col in df.columns]]

答案 8 :(得分:0)

列交换

import pandas as pd

df = pd.read_csv('/Users/parent/Desktop/Col_swap.csv')

print(df)

columns_titles = ["A","B","C","E"]

df_reorder=df.reindex(columns=columns_titles)

df_reorder.to_csv('/Users/parent/Desktop/col_reorder1.csv', index=False)

print(df_reorder)

输出:

    B   A   C   E
0  c1  a1  b1  d1
1  c2  a2  b2  d2


    A   B   C   E
0  a1  c1  b1  d1
1  a2  c2  b2  d2

答案 9 :(得分:0)

您可以轻松使用它

columns_titles = ["D","C","B","A"]

然后

df=df[column_titles]

答案 10 :(得分:0)

这在 Python 3.x 中对我有用:

df = df.iloc[:, [1, 0] + list(range(2, df.shape[1]))]

记住 df = P.iloc[:, [1, 0] + range(2, P.shape[1])] 不起作用并且会报错:

TypeError: can only concatenate list (not "range") to list