Python Pandas Pivot и значения карты

Допустим, у меня есть датафрейм со столбцами: id1, id2, valueType, value.

Сначала я хочу повернуть фрейм данных, чтобы добавить столбцы для различных возможных типов значений (valueType.unique()?). Затем для каждого значения я хочу отобразить его в правильный столбец valueType в строке с соответствующим id1, id2. Я полагаю, что мне также придется учитывать тот факт, что новые поворотные столбцы не обязательно будут одинаковыми по длине (то есть некоторые значения типа появляются чаще, чем другие), поэтому мне придется заполнять их с помощью NaN раньше. Какой лучший подход к этому? Я предполагаю, что я бы использовал pivot() и set_index() на кадре данных?


вход df

    id1 id2 valuetype  value
0     1   a    height      5
1     1   a     width      4
2     1   a    length      3
3     1   b    height      6
4     1   b     width      5
5     1   c    length      4
6     2   a    height      3
7     2   a     width      6
8     2   b    height      7
9     2   b    length      8
10    2   c    height      9
11    2   c     width      5

Ожидаемый результат

   id1 id2  height  length  width
0    1   a     5.0     3.0    4.0
1    1   b     6.0     NaN    5.0
2    1   c     NaN     4.0    NaN
3    2   a     3.0     NaN    6.0
4    2   b     7.0     8.0    NaN
5    2   c     9.0     NaN    5.0

1 ответ

Решение

Использование pivot_table

In [401]: (df.pivot_table(index=['id1', 'id2'], columns='valuetype', values='value')
             .reset_index().rename_axis(None, 1))
Out[401]:
   id1 id2  height  length  width
0    1   a     5.0     3.0    4.0
1    1   b     6.0     NaN    5.0
2    1   c     NaN     4.0    NaN
3    2   a     3.0     NaN    6.0
4    2   b     7.0     8.0    NaN
5    2   c     9.0     NaN    5.0

Или используйте groupby

In [404]: (df.groupby(['id1', 'id2', 'valuetype'])['value'].sum().unstack()
             .reset_index().rename_axis(None, 1))
Out[404]:
   id1 id2  height  length  width
0    1   a     5.0     3.0    4.0
1    1   b     6.0     NaN    5.0
2    1   c     NaN     4.0    NaN
3    2   a     3.0     NaN    6.0
4    2   b     7.0     8.0    NaN
5    2   c     9.0     NaN    5.0

Или используйте set_index

In [414]: (df.set_index(['id1', 'id2', 'valuetype'])['value'].unstack()
             .reset_index().rename_axis(None, 1))
Out[414]:
   id1 id2  height  length  width
0    1   a     5.0     3.0    4.0
1    1   b     6.0     NaN    5.0
2    1   c     NaN     4.0    NaN
3    2   a     3.0     NaN    6.0
4    2   b     7.0     8.0    NaN
5    2   c     9.0     NaN    5.0
Другие вопросы по тегам