В MATLAB для замены первого и второго столбцов таблицы A
можно сделать это 1
A = A(:, [2 1 3:end]);
Есть ли такой же удобный способ сделать это, если A
был pandas DataFrame
вместо?
1 MATLAB использует индексирование на основе 1.
В MATLAB для замены первого и второго столбцов таблицы A
можно сделать это 1
A = A(:, [2 1 3:end]);
Есть ли такой же удобный способ сделать это, если A
был pandas DataFrame
вместо?
1 MATLAB использует индексирование на основе 1.
pandas имеет метод reindex, который делает это. Вам просто нужно указать список с именами столбцов в том порядке, в котором вы хотите:
columnsTitles=["B","A"]
df=df.reindex(columns=columnsTitles)
Приветствия
Небольшой вариант ответа 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
UPDATE
Если вы просто хотите изменить порядок столбцов без изменения содержимого столбца, вы можете переиндексировать с помощью фантазийной индексации:
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
c = A.columns
A = A[c[np.r_[1, 0, 2:len(c)]]]
или, что еще проще:
A[[c[0], c[1]]] = A[[c[1], c[0]]]
* edit: исправлено по Ивану.
Я, наконец, решил:
A = A.iloc[:, [1, 0] + range(2, A.shape[1])]
Это гораздо менее удобно, чем версия MATLAB, но мне нравится то, что она не требует создания временных переменных.
Если у вас есть несколько столбцов и производительность и память не являются проблемой, вы можете просто использовать эту функцию:
def swap_columns(df, c1, c2):
df['temp'] = df[c1]
df[c1] = df[c2]
df[c2] = df['temp']
df.drop(columns=['temp'], inplace=True)
Я хотел бы использовать:
end = df.shape[1] # or len(df.columns)
df.iloc[:, np.r_[1, 0, 2:end]
В моем случае в моем фрейме данных более 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
Для Dataframes в 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]]