如何交换两个DataFrame列?

67 投票
16 回答
142586 浏览
提问于 2025-04-19 15:12

在MATLAB中,如果想要交换一个表格A的第一列和第二列,可以这样做1

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

如果A是一个pandas的DataFrame,有没有同样方便的方法来做到这一点呢?

1 MATLAB是从1开始计数的。

16 个回答

4

我最后选择了这个:

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

虽然这比MATLAB的版本要麻烦很多,但我喜欢它不需要创建临时变量这一点。

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

或者,更简单的方法是:

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

*编辑:根据伊万的建议进行了修正。

16

在我的情况下,我的数据表里有超过100列。所以我没有逐一列出所有的列,而是写了一个简单的函数来只交换其中的两列。

def df_column_switch(df, column1, column2):
    i = list(df.columns)
    a, b = i.index(column1), i.index(column2)
    i[b], i[a] = i[a], i[b]
    df = df[i]
    return df
35

这是对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
103

pandas有一个叫做reindex的方法,可以实现这个功能。你只需要提供一个包含列名的列表,并按照你想要的顺序排列这些列名:

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

谢谢!

撰写回答