Категориальные переменные в несколько столбцов

1

У меня есть dataframe с категориальной переменной Сегмент

ID  Segment Var
1   AAA     1
2   BBB     0
3   BBB     1
4   AAA     1
5   CCC     1
6   AAA     0 
7   AAA     1
8   AAA     0
9   BBB     0
10  CCC     0

И я хотел бы преобразовать сегмент столбца в 3 категории следующим образом:

ID  SegmentAAA  SegmentBBB  SegmentCCC
1   1           null        null
2   null        0           null
3   null        1           null
4   1           null        null
5   null        null        1
6   0           null        null
7   1           null        null
8   0           null        null
9   null        0           null
10  null        null        0

Не могли бы вы помочь мне в этом. Большое спасибо.

Теги:
pandas
numpy

4 ответа

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

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

df.set_index(['ID','Segment'])['Var']\
  .unstack()\
  .add_prefix('Segment')\
  .rename_axis([None], axis=1)\
  .reset_index()

Выход:

   ID  SegmentAAA  SegmentBBB  SegmentCCC
0   1         1.0         NaN         NaN
1   2         NaN         0.0         NaN
2   3         NaN         1.0         NaN
3   4         1.0         NaN         NaN
4   5         NaN         NaN         1.0
5   6         0.0         NaN         NaN
6   7         1.0         NaN         NaN
7   8         0.0         NaN         NaN
8   9         NaN         0.0         NaN
9  10         NaN         NaN         0.0

Вариант 2:

pd.crosstab(df.ID,df.Segment,df.Var,aggfunc='first')
  • 0
    Большое спасибо за вашу быструю помощь. Я использовал второй вариант. Могу ли я спросить вас, как я мог бы сделать это и для других столбцов сегмента? (Например, Сегмент1, Сегмент2, Сегмент3 и т. Д.) Я пробовал это, но это не работает: pd.crosstab (df.ID, df.Segment, [col для col в df.columns, если 'Segm в col], aggfunc =' первый')
  • 0
    Вы можете изменить структуру данных, сложить все эти столбцы сегмента в один столбец и сделать то же самое. Если бы создать новый вопрос с соответствующими данными, мы посмотрим, что наиболее эффективно.
4

Это стержень?

df.pivot(*df.columns)
Out[70]: 
Segment  AAA  BBB  CCC
ID                    
1        1.0  NaN  NaN
2        NaN  0.0  NaN
3        NaN  1.0  NaN
4        1.0  NaN  NaN
5        NaN  NaN  1.0
6        0.0  NaN  NaN
7        1.0  NaN  NaN
8        0.0  NaN  NaN
9        NaN  0.0  NaN
10       NaN  NaN  0.0
  • 0
    Ооо ... это новый трюк для меня. Распакуйте колонки для поворота. Блестящий короткий код руки. Мне это нравится.
  • 0
    @ ScottBoston СПАСИБО, ЧЕЛОВЕК
2
pd.get_dummies(df).drop('Var', axis=1)
  • 0
    Этот метод путает, что является нулем, а что является нулем? Где нули?
0

Pivot - лучший вариант. Если вы не хотите, чтобы ID был индексом и чтобы получить имена столбцов, как указано, это немного более специфично, чем ответ Вэнь

df.pivot(index='ID',columns='Segment',values='Var').add_prefix('Segment').reset_index()
Segment  ID  SegmentAAA  SegmentBBB  SegmentCCC
0         1         1.0         NaN         NaN
1         2         NaN         0.0         NaN
2         3         NaN         1.0         NaN
3         4         1.0         NaN         NaN
4         5         NaN         NaN         1.0
5         6         0.0         NaN         NaN
6         7         1.0         NaN         NaN
7         8         0.0         NaN         NaN
8         9         NaN         0.0         NaN
9        10         NaN         NaN         0.0

Ещё вопросы

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