将分类值列转换为 Python 中的统计值

Convert a categorical valued column to its statistical values in Python

我有一个数据框,其样本如下。

import pandas as pd

data = {'ID':['A','B','C','D','E','F'],
'Gender':['Man', 'Woman', 'Transgender', 'Non-binary,Transgender', 'Woman,Non-binary', 
'Man,Non-binary,Transgender']}

df = pd.DataFrame(data)
df

现在,我想为 'Gender' 列中的每个值创建一列,如果行中存在该值,则新列应为“1”,否则为空。所需的最终表格如下所示。

不能使用 pd.get_dummies(),因为许多行中有多个值(例如:'Non-binary, Transgender')。 我想到了对所有值进行手动硬编码,但想知道是否有一种方法可以使该过程自动化。 任何帮助是极大的赞赏。谢谢

使用Series.str.get_dummies,它允许您在字符串中有多个值的情况下指定分隔符,然后将结果连接回来。

pd.concat([df, df['Gender'].str.get_dummies(',').add_prefix('Gender_')], axis=1)

  ID                      Gender  Gender_Man  Gender_Non-binary  Gender_Transgender  Gender_Woman
0  A                         Man           1                  0                   0             0
1  B                       Woman           0                  0                   0             1
2  C                 Transgender           0                  0                   1             0
3  D      Non-binary,Transgender           0                  1                   1             0
4  E            Woman,Non-binary           0                  1                   0             1
5  F  Man,Non-binary,Transgender           1                  1                   1             0

好吧,您可以拆分 , 轻松回到可以使用 get_dummies:

的情况
>>> df_split = df[['ID']].join(df['Gender'].str.split(',')).explode('Gender')
>>> df_split
  ID       Gender
0  A          Man
1  B        Woman
2  C  Transgender
3  D   Non-binary
3  D  Transgender
4  E        Woman
4  E   Non-binary
5  F          Man
5  F   Non-binary
5  F  Transgender
>>> dummies = pd.get_dummies(df_split['Gender']).groupby(df_split['ID']).max().reset_index()
>>> dummies
  ID  Man  Non-binary  Transgender  Woman
0  A    1           0            0      0
1  B    0           0            0      1
2  C    0           0            1      0
3  D    0           1            1      0
4  E    0           1            0      1
5  F    1           1            1      0 
>>> df.merge(dummies, on='ID')
  ID                      Gender  Man  Non-binary  Transgender  Woman
0  A                         Man    1           0            0      0
1  B                       Woman    0           0            0      1
2  C                 Transgender    0           0            1      0
3  D      Non-binary,Transgender    0           1            1      0
4  E            Woman,Non-binary    0           1            0      1
5  F  Man,Non-binary,Transgender    1           1            1      0