猿问

我需要将列列表中的每个元素转换为 python pandas 中的新列

我有一个 Python 数据框,如下所示:


   Name   Hobbies

0  Paul   ["Watch_NBA", "Play_PS4"]

1  Jeff   ["Play_hockey", "Read", "Play_PS4"]

2  Kyle   ["Sleep", "Watch_NBA"]

我需要将列表中的每个元素转换到新列中,如果它出现在原始列表中,则分配值 0 或 1。结果显示如下:


   Name   Watch_NBA  Play_PS4 Play_hockey Read Sleep

0  Paul       1          1        0        0     0

1  Jeff       0          1        1        1     0

2  Kyle       1          0        0        0     1

有人知道我怎么能做到这一点。请记住,我将在专栏中使用很多爱好,因此它显示出一点自动化而不是硬编码。谢谢!!!


慕的地6264312
浏览 110回答 4
4回答

阿波罗的战车

get_dummies()很好,但sklearn's MultiLabelBinarizer有更好的性能:from sklearn.preprocessing import MultiLabelBinarizermlb = MultiLabelBinarizer()a = mlb.fit_transform(df["Hobbies"])df_expanded = pd.DataFrame(a, columns=mlb.classes_, index=df.index)# merge them using the following:df_merged = df.merge(df_expanded, left_index=True, right_index=True)print(df_merged)index   Name    Hobbies                         Play_PS4    Play_hockey Read    Sleep   Watch_NBA0       Paul    [Watch_NBA, Play_PS4]           1           0           0       0       11       Jeff    [Play_hockey, Read, Play_PS4]   1           1           1       0       02       Kyle    [Sleep, Watch_NBA]              0           0           0       1       1

慕姐4208626

In [86]: df                                                                                                                                                                                                                                                                      Out[86]:    Name              Hobbies0  Paul           [NBA, PS4]1  Jeff  [Hockey, Read, PS4]2  Kyle         [Sleep, NBA]In [87]: df['dummy'] = 1                                                                                                                                                                                                                                                         In [88]: df.explode("Hobbies").pivot(index='Name', columns='Hobbies', values='dummy').fillna(value=0)                                                                                                                                                                            Out[88]: Hobbies  Hockey  NBA  PS4  Read  SleepName                                  Jeff        1.0  0.0  1.0   1.0    0.0Kyle        0.0  1.0  0.0   0.0    1.0Paul        0.0  1.0  1.0   0.0    0.0

子衿沉夜

你想要get_dummies()方法。对于你的例子:names = df.Namedf = pd.get_dummies(df.Hobbies.apply(pd.Series).stack()).sum(level=0)df.insert(0, 'Name', names)#output:   Name  Play_PS4  Play_hockey  Read  Sleep  Watch_NBA0  Paul         1            0     0      0          11  Jeff         1            1     1      0          02  Kyle         0            0     0      1          1

炎炎设计

你可以试试这个:n = df['Name']df = df['Hobbies'].apply(lambda x: pd.Series([1] * len(x), index=x)).fillna(0, downcast='infer')df.insert(0, 'Name', n)print(df)输出:   Name  Watch_NBA  Play_PS4  Play_hockey  Read  Sleep0  Paul          1         1            0     0      01  Jeff          0         1            1     1      02  Kyle          1         0            0     0      1
随时随地看视频慕课网APP

相关分类

Python
我要回答