Я поднимаю этот вопрос для изучения нового метода для себя.
У меня есть dataframe, как показано ниже,
ID Value
0 1 10
1 1 12
2 1 14
3 1 16
4 1 18
5 2 32
6 2 12
7 2 -8
8 2 -28
9 2 -48
10 2 -68
11 3 12
12 3 1
13 3 43
Я хочу преобразовать это в:
ID Value ID Value ID Value
0 1.0 10.0 2 32 3.0 12.0
1 1.0 12.0 2 12 3.0 1.0
2 1.0 14.0 2 -8 3.0 43.0
3 1.0 16.0 2 -28 NaN NaN
4 1.0 18.0 2 -48 NaN NaN
5 NaN NaN 2 -68 NaN NaN
один из способов решить эту проблему,
Распечатать
pd.concat([df[df['ID']==1].reset_index(drop=True),df[df['ID']==2].reset_index(drop=True),df[df['ID']==3].reset_index(drop=True)],axis=1)
Но я думаю, я могу сделать то же concat
операцию для каждого метода GroupBy результата вместо фильтрации по значению?
Любые лучшие/новые подходы более ценятся.
Заранее спасибо.
Да, очень возможно и довольно просто с pd.concat
, на самом деле.
df = pd.concat({k : g.reset_index(drop=True) for k, g in df.groupby('ID')}, axis=1)
df.columns = df.columns.droplevel(0)
Или небольшая вариация в темном (теперь удаленном) ответе (что не дает вам возможности автоматически указывать суффиксы столбцов) -
pd.concat([g.reset_index(drop=True) for _, g in df.groupby('ID')], axis=1)
df
ID Value ID Value ID Value
0 1.0 10.0 2 32 3.0 12.0
1 1.0 12.0 2 12 3.0 1.0
2 1.0 14.0 2 -8 3.0 43.0
3 1.0 16.0 2 -28 NaN NaN
4 1.0 18.0 2 -48 NaN NaN
5 NaN NaN 2 -68 NaN NaN
Однако имена этих столбцов ужасные. Вместо того, чтобы отбрасывать первый уровень, вы должны рассмотреть возможность их объединения, чтобы сформировать pre/suf-fix для второго уровня. Это должно быть хорошим упражнением для вас с df.columns.map
.