Преобразование (частично) вертикального фрейма данных в горизонтальный с помощью Pandas

#python #python-3.x #pandas #dataframe

#python #python-3.x #панды #фрейм данных

Вопрос:

У меня есть скрипт, который создает df, который выглядит следующим образом (со многими другими столбцами атрибутов)

Итак, для каждого ITEM_IDX у меня есть идентификатор времени (QM_ID) и значение (VALUE).

 ITEM_IDX;XVAL;YVAL;ZVAL;PT_ID;...;QM_ID;VALUE
1;635000;5020000;15.1;1000000;...;6000;0.00
2;635010;5020000;15.0;1000001;...;6000;0.56
3;635020;5020000;15.2;1000002;...;6000;0.45
1;635000;5020000;15.1;1000000;...;6001;0.10
2;635010;5020000;15.0;1000001;...;6001;0.55
3;635020;5020000;15.2;1000002;...;6001;0.48
1;635000;5020000;15.1;1000000;...;6002;0.13
2;635010;5020000;15.0;1000001;...;6002;0.50
3;635020;5020000;15.2;1000002;...;6002;0.41
 

Мне нужно создать вывод, отформатированный следующим образом.
Для каждого ITEM_IDX мне нужен столбец для каждого QM_ID и столбец ЗНАЧЕНИЙ в качестве его значения.

 ITEM_IDX;XVAL;YVAL;ZVAL;PT_ID;...;QM_ID_6000;QM_ID_6001;QM_ID_6002
1;635000;5020000;15.1;1000000;...;0.00;0.10;0.13
2;635010;5020000;15.0;1000001;...;0.56;0.55;0.50
3;635020;5020000;15.2;1000002;...;0.45;0.48;0.41
 

Это df длиной до 1 млн строк, с разным QM_ID до 4 тыс., поэтому на выходе будет много столбцов. (Да, я знаю…)

Я попытался создать новый df с основными столбцами, затем сгруппировать мой df по QM_ID и добавлять столбцы один за другим, но это медленно и не совсем «pythonic». Я ищу способ сделать это быстрее и эффективнее, поскольку мне придется делать это довольно часто.

Большое спасибо 🙂

PS: Я использую python 3.7.9 и pandas 1.1.3

Редактировать, мое текущее «решение»:

 my_df = pd.read_csv(datafile, sep=';')
my_df_result = my_df[['ITEM_IDX','XVAL','YVAL','ZVAL','PT_ID']].drop_duplicates(subset=['ITEM_IDX'], keep='first')
for q in my_df['QM_ID'].unique().tolist():
    my_df_result[f'QM_ID_{q}'] = my_df[my_df['QM_ID'] == q]['VALUE'].tolist()
 

Ответ №1:

Попробуй это:

 df.pivot(['ITEM_IDX', 'XVAL', 'YVAL', 'ZVAL', 'PT_ID'], 'QM_ID', 'VALUE')
  .add_prefix('QM_ID_').reset_index()
 

Вывод:

 QM_ID  ITEM_IDX    XVAL     YVAL  ZVAL    PT_ID  QM_ID_6000  QM_ID_6001  QM_ID_6002
0             1  635000  5020000  15.1  1000000        0.00        0.10        0.13
1             2  635010  5020000  15.0  1000001        0.56        0.55        0.50
2             3  635020  5020000  15.2  1000002        0.45        0.48        0.41
 

pivot ваш фрейм данных, определяющий строки и столбцы, затем используйте add_prefix , чтобы правильно назвать столбцы, затем reset_index

Комментарии:

1. Спасибо, именно то, что мне нужно. Быстрее, и это даже работает, если количество QM_ID отличается для каждого элемента.

2. @Akarius Всегда пожалуйста. Счастливого кодирования. Будьте в безопасности и будьте здоровы.