У меня есть скрипт, который создает 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()
Попробуй это:
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
@Akarius Не за что. Удачного кодирования. Будьте в безопасности и будьте здоровы.
Спасибо, именно то, что мне нужно. Быстрее и даже работает, если количество QM_ID разное для каждого элемента.