Перемещение столбца в pandas dataframe
У меня есть следующий фреймворк:
a b x y
0 1 2 3 -1
1 2 4 6 -2
2 3 6 9 -3
3 4 8 12 -4
Как я могу перемещать столбцы b и x таким образом, что они являются последними 2 столбцами в dataframe? Я хотел бы указать b и x по имени, но не другие столбцы.
Ответы
Ответ 1
Вы можете изменить порядок столбцов, указав их порядок:
df = df[['a', 'y', 'b', 'x']]
В случае больших фреймов данных, где заголовки столбцов являются динамическими, вы можете использовать понимание списка, чтобы выбрать каждый столбец, не входящий в ваш целевой набор, а затем добавить конечный набор в конец.
>>> df[[c for c in df if c not in ['b', 'x']]
+ ['b', 'x']]
a y b x
0 1 -1 2 3
1 2 -2 4 6
2 3 -3 6 9
3 4 -4 8 12
Чтобы сделать его более пуленепробиваемым, вы можете убедиться, что целевые столбцы действительно находятся в кадре данных:
cols_at_end = ['b', 'x']
df = df[[c for c in df if c not in cols_at_end]
+ [c for c in cols_at_end if c in df]]
Ответ 2
cols = list(df.columns.values) #Make a list of all of the columns in the df
cols.pop(cols.index('b')) #Remove b from list
cols.pop(cols.index('x')) #Remove x from list
df = df[cols+['b','x']] #Create new dataframe with columns in the order you want
Ответ 3
Вы можете использовать путь ниже. Это очень просто, но похоже на хороший ответ, данный Чарли Хейли.
df1 = df.pop('b') # remove column b and store it in df1
df2 = df.pop('x') # remove column x and store it in df2
df['b']=df1 # add b series as a 'new' column.
df['x']=df2 # add b series as a 'new' column.
Теперь у вас есть ваш фрейм данных со столбцами "b" и "x" в конце. Вы можете посмотреть это видео с OSPY: https://youtu.be/RlbO27N3Xg4
Ответ 4
Вы можете использовать pd.Index.difference
с np.hstack
, затем reindex
или использовать индексирование на основе меток. В целом, это хорошая идея, чтобы избежать списочных пониманий или других явных циклов с объектами NumPy/Pandas.
cols_to_move = ['b', 'x']
new_cols = np.hstack((df.columns.difference(cols_to_move), cols_to_move))
# OPTION 1: reindex
df = df.reindex(columns=new_cols)
# OPTION 2: direct label-based indexing
df = df[new_cols]
# OPTION 3: loc label-based indexing
df = df.loc[:, new_cols]
print(df)
# a y b x
# 0 1 -1 2 3
# 1 2 -2 4 6
# 2 3 -3 6 9
# 3 4 -4 8 12
Ответ 5
Эта функция переупорядочивает ваши столбцы без потери данных. Все пропущенные столбцы остаются в центре набора данных:
def reorder_columns(columns, first_cols=[], last_cols=[], drop_cols=[]):
columns = list(set(columns) - set(first_cols))
columns = list(set(columns) - set(drop_cols))
columns = list(set(columns) - set(last_cols))
new_order = first_cols + columns + last_cols
return new_order
Пример использования:
my_list = ['first', 'second', 'third', 'fourth', 'fifth', 'sixth']
reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])
# Output:
['fourth', 'third', 'first', 'sixth', 'second']
Чтобы назначить свой фрейм данных, используйте:
my_list = df.columns.tolist()
reordered_cols = reorder_columns(my_list, first_cols=['fourth', 'third'], last_cols=['second'], drop_cols=['fifth'])
df = df[reordered_cols]
Ответ 6
Вы также можете сделать это как однострочник:
df.drop(columns=['b', 'x']).assign(b=df['b'], x=df['x'])
Ответ 7
Альтернативный, более общий метод;
from pandas import DataFrame
def move_columns(df: DataFrame, cols_to_move: list, new_index: int) -> DataFrame:
"""
This method re-arranges the columns in a dataframe to place the desired columns at the desired index.
ex Usage: df = move_columns(df, ['Rev'], 2)
:param df:
:param cols_to_move: The names of the columns to move. They must be a list
:param new_index: The 0-based location to place the columns.
:return: Return a dataframe with the columns re-arranged
"""
other = [c for c in df if c not in cols_to_move]
start = other[0:new_index]
end = other[new_index:]
return df[start + cols_to_move + end]