2016-09-13 2 views
0

У меня есть некоторые данные в следующем формате в csv-файле.Как преобразовать данные, как указано в python?

Id Category 
    1 A 
    2 B 
    3 C 
    4 B 
    5 C 
    6 d 

Я хотел бы, чтобы преобразовать его в форму ниже и сохранить его другой CSV файл

Id A B C D E 
1 1 0 0 0 0 
2 0 1 0 0 0 
3 0 0 1 0 0 
4 0 1 0 0 0 
5 0 0 1 0 0 
6 0 0 0 1 0 
+1

Возможные дубликатом [Фиктивные переменные, когда не все категории присутствуют ] (http://stackoverflow.com/questions/37425961/dummy-variables-when-not-all-categories-are-present) – ayhan

+0

Он называется одним горячим кодированием, и вы можете сделать это с помощью функции sklearn OneHotEncoder() – mitsi

+0

@ayhan Это аналогичный вопрос, но как передать файл CSV, где присутствуют мои данные, а не напрямую передавать данные? Спасибо –

ответ

2

Попробуйте с pd.get_dummies()

>> df = pd.read_csv(<path_to_file>, sep=',', encoding='utf-8', header=0) 

>> df 
    Id Category 
0 1   A 
1 2   B 
2 3   C 
3 4   B 
4 5   C 
5 6   d 

>> pd.get_dummies(df.Category) 

Это будет кодировать Category и дать вам новые столбцы :

A B C d 

Но не будет «исправлять» d -> D и не даст вам никаких столбцов, которые не могут быть выведены из значений, которые у вас есть в Category.

Предлагаю вам проверить решение, опубликованное в комментарии ранее для этого.

РЕДАКТИРОВАТЬ

# Load data from .CSV with pd.read_csv() as demonstrated above 

In [13]: df 
Out[13]: 
    Category Id 
0  A 1 
1  B 2 
2  C 3 
3  B 4 
4  C 5 
5  D 6 

## One-liner for hot-encoding, then concatenating to original dataframe 
## and finally dropping the old column 'Category', you can skip the 
## last part if you want to keep original column as well. 
In [14]: df = pd.concat([df, pd.get_dummies(df.Category)], axis=1).drop('Category', axis=1) 

In [15]: df 
Out[15]: 
    Id A B C D 
0 1 1.0 0.0 0.0 0.0 
1 2 0.0 1.0 0.0 0.0 
2 3 0.0 0.0 1.0 0.0 
3 4 0.0 1.0 0.0 0.0 
4 5 0.0 0.0 1.0 0.0 
5 6 0.0 0.0 0.0 1.0 

## Write to file 
In [16]: df.to_csv(<output_path>, sep='\t', encoding='utf-8', index=None) 

Как вы можете видеть это не транспозиции, только результат добавляется к каждой строке горячего кодирования Category столбца.

Независимо от того, принимает ли Excel окончательные данные или нет, вы не можете сделать с Пандами об этом, к сожалению.

Надеюсь, это поможет.

+0

Пожалуйста, проверьте обновленный ответ. Для полного решения я предлагаю вам взглянуть на ссылку, представленную в первом комментарии под оригинальным сообщением. – Thanos

+0

Я получил транспонирование того, что мне нужно, и использовал df.transpose(). Спасибо :) –

+0

@MohitVellanki Если вы нашли этот ответ полезным, то примите его пожалуйста, так что ясно, что на этот вопрос был дан ответ. – Thanos

1

Используйте сводную таблицу (обновленный включить .csv чтения функции/записи):

import pandas as pd 
path = 'the path to your file' 
df = pd.read_csv(path) 

# your original dataframe 
# Category Id 
# 0  A 1 
# 1  B 2 
# 2  C 3 
# 3  B 4 
# 4  C 5 
# 5  D 6 

# pivot table 
df.pivot_table(index=['Id'], columns='Category', fill_value=0, aggfunc='size') 

# save to file 
df.to_csv('path\filename.csv') #e.g. 'C:\\Users\\you\\Documents\\filename.csv' 

ВЫВОД:

Category A B C D 
Id     
1   1 0 0 0 
2   0 1 0 0 
3   0 0 1 0 
4   0 1 0 0 
5   0 0 1 0 
6   0 0 0 1 
+0

см. Обновление в решении: 'df.to_csv ('путь/filename.csv') # например. 'C: \\ Users \\ you \\ Documents \\ filename.csv'' – NickBraunagel

+0

Файл не преобразовывается. Он просто добавляет другой столбец идентификатора перед существующим столбцом. –

+0

Что значит «конвертировать»? Вы хотите заменить 'd' на 'D'? – NickBraunagel

Смежные вопросы