Конкат результат групповых панд

1

Я поднимаю этот вопрос для изучения нового метода для себя.

У меня есть 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 результата вместо фильтрации по значению?

Любые лучшие/новые подходы более ценятся.

Заранее спасибо.

Теги:
pandas

1 ответ

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

Да, очень возможно и довольно просто с 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.

  • 0
    Ах, я был близок: 0
  • 1
    @ Темно они были достаточно разные, так что это не проблема. :) Во всяком случае, вы взяли это хорошо, поэтому я добавил это как вариант здесь.
Показать ещё 5 комментариев

Ещё вопросы

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