Заполните значения для категориальных данных в соответствующих столбцах с горячим кодированием

59
7

У меня есть CSV файл, который имеет сотни столбцов и строк. Там два столбца меня интересуют, и на основании этого мне нужно создать новые столбцы в этом CSV файле. Пример: у меня есть интересующие столбцы, как показано ниже, input.csv

 count  description    
1 Good
2 Medium
2 Best
1 Worst
2 Worst
1 Medium
9 Good

Выход я ожидал, output.csv

 count  description    Good  Medium  Best  Worst
1 Good 1 0 0 0
2 Medium 0 2 0 0
2 Best 0 0 2 0
1 Worst 0 0 0 1
2 Worst 0 0 0 1
1 Medium 0 1 0 0
9 Good 9 0 0 0

В приведенной выше таблице csv, основанной на значениях 'count' и 'description'. Я создаю новые столбцы "Хороший", "Средний", "Лучший", "Наихудший" (из значений описания), заполняю значения из "счетчика" и помещаю нулевое значение в недоступные значения этой строки. Я попытался сравнить столбцы и отобразить значение, но не смог правильно указать это значение в новых столбцах.

спросил(а) 2018-12-17T16:35:00+03:00 1 год, 11 месяцев назад
1
Решение
59

спасибо за ответы выше. Я также попытался и решение следующим образом,

import pandas as pd
df = pd.read_csv('/input.csv')
res = df.pivot(index='index', columns='description', values='count')
res.to_csv('/out.csv',',',dtype='unicode8')
res1 = res.replace('NaN', '0', regex=True)
res1.to_csv('/out1.csv',',',dtype='unicode8')

Спасибо сундар

ответил(а) 2018-12-17T17:08:00+03:00 1 год, 11 месяцев назад
58

str.get_dummies

Для производительности и краткости используйте str.get_dummies с широковещательным умножением.

v = df['description'].str.get_dummies()
df.join(pd.DataFrame(
v.values * df['count'].values[:, None], columns=v.columns))

count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0

Теперь я вижу, что это немного другая версия ответа @nixon, но, надеюсь, извините меня за различие в том, как осуществляется вещание :-)

pivot и fillna

Или модифицированная версия решения OP pivot:

df.join(df.reset_index()
.pivot(index='index', columns='description', values='count')
.fillna(0, downcast='infer'))

count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0

ответил(а) 2018-12-17T17:06:00+03:00 1 год, 11 месяцев назад
59

Вы можете повернуть и добавить оригинальный кадр:

f = df.pivot(columns='description', values='count').fillna(value=0, downcast='infer')
df[['count', 'description']].merge(f, left_index=True, right_index=True)

Что приводит к:

   count description  Best  Good  Medium  Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0

ответил(а) 2018-12-17T16:52:00+03:00 1 год, 11 месяцев назад
59

Способ сделать это - создать фиктивные столбцы, используя pd.get_dummies, и multiply их на df['count] чтобы получить желаемый результат:

d = pd.get_dummies(df.description) 
df.assign(**d.multiply(df['count'], axis=0))

count description Best Good Medium Worst
0 1 Good 0 1 0 0
1 2 Medium 0 0 2 0
2 2 Best 2 0 0 0
3 1 Worst 0 0 0 1
4 2 Worst 0 0 0 2
5 1 Medium 0 0 1 0
6 9 Good 0 9 0 0

ответил(а) 2018-12-17T16:49:00+03:00 1 год, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема