Присваивать значения столбцам Pandas на основе другого столбца итеративно - PullRequest
0 голосов
/ 12 июня 2018

У меня есть переменная в фрейме данных 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')

1 Ответ

0 голосов
/ 12 июня 2018

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

Вы можете избавитьсяиз этих label префиксов и подчеркиваний с использованием аргументов prefix и prefix_sep:

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

Но тогда вы избавляетесь от строк без дубликатов, и я не думаю, что это то, что вы хотите (если только яошибиться).Если нет, просто опустите отбрасывание дубликатов вызовов:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...