2016-09-13 34 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' 

OUTPUT:

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('path/filename.csv')#例如'C:\\ Users \\ you \\ Documents \\ filename.csv'' – NickBraunagel

+0

該文件未被轉換。它只是在現有列之前添加另一個Id列。 –

+0

「轉換」是什麼意思?你想用'D'代替'd'嗎? – NickBraunagel

相關問題