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

У меня есть скрипт, который создает 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 и столбец VALUE в качестве его значения.

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 до 1M строк с до 4k различных QM_ID, поэтому на выходе будет много столбцов. (Да, знаю...)

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

Большое спасибо :)

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()
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
671
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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

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

Akarius 15.12.2020 19:26

@Akarius Не за что. Удачного кодирования. Будьте в безопасности и будьте здоровы.

Scott Boston 15.12.2020 19:28

Другие вопросы по теме