Контекст
У меня есть pandas-DataFrame со структурой, аналогичной таблице слева:
+ Category + Content + Layer + Category + Content + Layer
Index | | | Index | | |
---------------------------------- ----------------------------------
000001| "A" | "Dummy" | 0 -> 000001| "A" | "Dummy" | 0
---------------------------------- ----------------------------------
000002| "A" | "Dummy" | 1 -> 000003| "A" | "Dummy" | 0
---------------------------------- ----------------------------------
000003| "A" | "Dummy" | 0 -> 000002| "A" | "Dummy" | 1
---------------------------------- ----------------------------------
000004| "A" | "Dummy" | 1 -> 000004| "A" | "Dummy" | 1
---------------------------------- ----------------------------------
000005| "B" | "Dummy" | 2 = 000005| "B" | "Dummy" | 2
---------------------------------- ----------------------------------
000006| "B" | "Dummy" | 0 = 000006| "B" | "Dummy" | 0
---------------------------------- ----------------------------------
000007| "B" | "Dummy" | 4 = 000007| "B" | "Dummy" | 4
---------------------------------- ----------------------------------
Чего я хочу добиться, так это изменить порядок фрейма данных, как показано справа.
Вопрос
Как показано в таблице справа, только часть фрейма данных должна быть переупорядочена — только элементы category == "A"
должны быть упорядочены в порядке возрастания их layer
.
Все элементы category == "B"
должны оставаться такими, какие они есть (это моя текущая проблема при работе с dataframe.sort_values()
и т. д.).
Как я могу изменить порядок (отсортировать) только указанную часть фрейма данных, не затрагивая остальные?
Вы можете сделать это в два этапа:
mask
.loc
(чтобы предотвратить выравнивание значений индекса)
.loc
: Access a group of rows and columns by label(s) or a boolean array. (Link to pandas-Documentation)
#Boolean mask of the entire dataframe in order to identify relevant rows
mask = df['Category'].eq('A') #Anlog to mask = (df["Category"] == 'A')
#pandas >= 0.24
df.loc[mask] = df.loc[mask].sort_values('Layer').to_numpy()
#pandas < 0.24
df.loc[mask] = df.loc[mmask.sort_values('Layer').values
#Result
print (df)
Category Content Layer
Index
000001 A Dummy 0
000002 A Dummy 0
000003 A Dummy 1
000004 A Dummy 1
000005 B Dummy 2
000006 B Dummy 0
000007 B Dummy 4
Спасибо за быстрый ответ, работает, когда я адаптирую его к своей проблеме :)