【问题标题】:Assign values to Pandas columns based on another column iteratively基于另一列迭代地为 Pandas 列赋值
【发布时间】:2018-11-22 01:47:07
【问题描述】:

我在 Pandas 数据框中有一个名为“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')

【问题讨论】:

    标签: python pandas loops if-statement


    【解决方案1】:

    IIUC,您可以在删除重复项后使用pd.get_dummies,这将比迭代执行更快并且代码更简洁:

    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
    

    只需在标签列上调用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
    

    【讨论】:

    • 谢谢,但您能否说明如何使用“标签”列指定(因为我的实际数据包含多个列)?我试过 df['label'],但没有用。
    猜你喜欢
    • 2019-08-10
    • 2021-10-08
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 2021-09-18
    • 2020-11-17
    • 2023-03-25
    • 2021-09-25
    相关资源
    最近更新 更多