Python: как расплавить фрейм данных, сохраняя определенный порядок / пользовательскую сортировку

1

У меня есть dataframe df

Cat  B_1 A_2 C_3
A      1   2   3
B      4   5   6
C      7   8   9

который я хочу преобразовать в dataframe, чтобы строки в столбце Label выполняли порядок столбцов df для каждой категории.

Desired output

    Cat Label Value
    A     B_1    1
    A     A_2    2
    A     C_3    3
    B     B_1    4
    B     A_2    5
    B     C_3    6
    C     B_1    7
    C     A_2    8
    C     C_3    9  

когда я пытаюсь

pd.melt(df, id_vars=["Cat"], var_name="Label",value_name="Value")

Я теряю желаемый порядок в столбце Ярлык, результаты сортируются, как показано ниже,

Cat Label Value
A     B_1    1
B     B_1    4
C     B_1    7
A     A_2    2
...

Может ли принудительный принудительный ввод строк в функцию расплава? если нет, как можно добиться этой пользовательской сортировки?


ОБНОВИТЬ

Я переименовал ярлыки, поскольку они не соответствуют алфавитному порядку, так что простая сортировка не работает

Теги:
pandas
dataframe

1 ответ

1
Лучший ответ

IIUC, вы можете использовать тот же код и добавить .sort_values('Cat'), или более просто:

df.melt('Cat',var_name='Label',value_name='Value').sort_values('Cat')

  Cat Label  Value
0   A   L_1      1
3   A   L_2      2
6   A   L_3      3
1   B   L_1      4
4   B   L_2      5
7   B   L_3      6
2   C   L_1      7
5   C   L_2      8
8   C   L_3      9

Если вы хотите заказать его по-своему (в приведенном ниже примере B предшествует A который предшествует C), тогда вы можете установить Cat как упорядоченную категориальную:

melted = df.melt('Cat',var_name='Label',value_name='Value')

melted['Cat'] = pd.Categorical(melted['Cat'], categories=['B','A','C'], ordered=True)

melted.sort_values('Cat')

  Cat Label  Value
1   B   L_1      4
4   B   L_2      5
7   B   L_3      6
0   A   L_1      1
3   A   L_2      2
6   A   L_3      3
2   C   L_1      7
5   C   L_2      8
8   C   L_3      9

Альтернативой является использование stack, но тогда вам приходится иметь дело с раздражающим переименованием столбцов:

df.set_index('Cat').stack().reset_index().rename(columns={'level_1':'Label', 0:'Value'})

  Cat Label  Value
0   A   L_1      1
1   A   L_2      2
2   A   L_3      3
3   B   L_1      4
4   B   L_2      5
5   B   L_3      6
6   C   L_1      7
7   C   L_2      8
8   C   L_3      9
  • 0
    Я должен был сказать, что столбцы не следуют в алфавитном порядке
  • 0
    Тогда метод stack который я поставил в качестве альтернативы, может быть предпочтительным, это работает? В противном случае вы могли бы установить Cat как упорядоченную категориальную переменную, но это добавляет целый отдельный шаг.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню