在MATLAB中,要交换表A
的第一列和第二列,可以执行此操作 1
A = A(:, [2 1 3:end]);
如果A
是大熊猫DataFrame
,是否有同样方便的方法呢?
1 MATLAB使用基于1的索引。
答案 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