基于另一列迭代地为列赋值

2024-09-28 20:15:31 发布

您现在位置:Python中文网/ 问答频道 /正文

在Pandas dataframe中有一个名为“label”的变量,它包含多个字符串值(例如:'label1', "label2', 'label3'...)。你知道吗

label
label1
label1
label23
label3
label11

我将所有唯一的值输出到一个列表中,然后创建新的变量

unique_labels = df['label'].unique()

for i in unique_labels: # create new single label variable holders
    df[str(i)] = 0

现在我有了

label    label1    label2 .... label23
label1     0         0            0
label23    0         0            0

我想基于'label'将相应的值赋给新的单标签变量,如下所示

label    label1    label2 .... label23
label1     1         0            0
label23    0         0            1

这是我的密码

def single_label(df):
for i in range(len(unique_labels)):
    if df['label'] == str(unique_labels[i]):
        df[unique_labels[i]] == 1


df = df.applymap(single_label)

获取此错误

TypeError: ("'int' object is not subscriptable", 'occurred at index Unnamed: 0')

Tags: 字符串indataframepandasdfforlabelslabel
1条回答
网友
1楼 · 发布于 2024-09-28 20:15:31

IIUC,在删除重复项之后,可以使用^{},这将比迭代更快,产生更干净的代码:

df.drop_duplicates().join(pd.get_dummies(df.drop_duplicates()))

     label  label_label1  label_label11  label_label23  label_label3
0   label1             1              0              0             0
2  label23             0              0              1             0
3   label3             0              0              0             1
4  label11             0              1              0             0

您可以使用prefixprefix_sep参数除去这些label前缀和下划线:

df.drop_duplicates().join(pd.get_dummies(df.drop_duplicates(),
                                         prefix='', prefix_sep=''))

     label  label1  label11  label23  label3
0   label1       1        0        0       0
2  label23       0        0        1       0
3   label3       0        0        0       1
4  label11       0        1        0       0

编辑:带有第二列,即:

>>> df
     label second_column
0   label1             a
1   label1             b
2  label23             c
3   label3             d
4  label11             e

只需在label列上调用pd.get_dummies

df.drop_duplicates('label').join(pd.get_dummies(df['label'].drop_duplicates(),
                                         prefix='', prefix_sep=''))

     label second_column  label1  label11  label23  label3
0   label1             a       1        0        0       0
2  label23             c       0        0        1       0
3   label3             d       0        0        0       1
4  label11             e       0        1        0       0

但是,这样就可以去掉没有重复的行,我认为这不是您想要的(除非我弄错了)。如果没有,只需省略drop duplicates调用:

df.join(pd.get_dummies(df['label'], prefix='', prefix_sep=''))

     label second_column  label1  label11  label23  label3
0   label1             a       1        0        0       0
1   label1             b       1        0        0       0
2  label23             c       0        0        1       0
3   label3             d       0        0        0       1
4  label11             e       0        1        0       0

相关问题 更多 >