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

У меня есть CSV-файл, который имеет 100 столбцов и строк.Там два столбца меня интересуют, и на основании этого мне нужно создать новые столбцы в этом 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и описание.Я создаю новые столбцы Good, Medium, Best, Worst (из значений описания) и заполняю значения из count и помещаю нулевое значение в недоступные значения этой строки.Я попытался сравнить столбцы и отобразить значение, но не смог правильно указать это значение в новых столбцах.

Ответы [ 4 ]

0 голосов
/ 17 декабря 2018

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

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')

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

0 голосов
/ 17 декабря 2018

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

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
0 голосов
/ 17 декабря 2018

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's answer , но, надеюсь, разница в способе вещания должна извинить меня: -)


pivot и fillna

Или,модифицированная версия решения 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
0 голосов
/ 17 декабря 2018

Способ сделать это - создать фиктивные столбцы, используя 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
...