2017-07-28 75 views
3

我試圖通過分解數據框來對數據框中的類別列表進行編碼。然後,我將從這一系列列表中創建一個矩陣(將它們標準化爲一個設定的長度,創建一個多維數組,並對矩陣中的元素進行一次熱編碼)。熊貓數據框中的編碼/因子列表

但是,這些因素不能保持行之間的一致性。 這可以看這裏:

>>> import pandas as pd 
>>> df = pd.DataFrame({'A': [ ['Other', 'Male', 'Female', 'Male', 'Other'], ['Female', 'Other', 'Male'] ]}) 
>>> df['B'] = df.A.apply(lambda x: pd.factorize(x)[0]) 
>>> df 
            A    B 
0 [Other, Male, Female, Male, Other] [0, 1, 2, 1, 0] 
1    [Female, Other, Male]  [0, 1, 2] 

有誰知道如何來維護這個系列是行中相同的編碼?

+0

不get_dummies不適合你的使用情況工作? –

+0

感謝您提供'get_dummies'的想法,我非常喜歡創建一個熱門矢量的方式。不幸的是,我還沒有想出一種方法,即當每個元素的列表長度不相等時,可以將所有這些熱點矢量從系列中移回到3D張量形狀中。 – chase

回答

4

您可以使用從sklearn LabelEncoder

裝編碼器:

from sklearn import preprocessing 
le = preprocessing.LabelEncoder() 
le.fit([s for l in df.A for s in l]) 

變換列:

df.A.apply(le.transform) 
#0 [2, 1, 0, 1, 2] 
#1   [0, 2, 1] 
#Name: A, dtype: object 

le.classes_ 
#array(['Female', 'Male', 'Other'], 
#  dtype='<U6') 
+1

謝謝,我真的很喜歡這可以讓你輕鬆地用'df ['C'] = df.B.apply(lambda x:le.classes_ [x])'返回到標籤。 – chase

3

您可以輕鬆地使用列A中的所有值自行完成。

首先,使用集合理解來創建列A中所有唯一項目的集合。然後使用字典理解,其中鍵是這些唯一項目,並且基於這些排序的唯一項目來枚舉值。

然後使用列表理解查找此字典中的項目。

s = set(item for sublist in df.A for item in sublist) 
s = {k: n for n, k in enumerate(sorted(list(s)))} 

>>> df.assign(B=[[s[key] for key in sublist] for sublist in df['A']]) 
            A    B 
0 [Other, Male, Female, Male, Other] [2, 1, 0, 1, 2] 
1    [Female, Other, Male]  [0, 2, 1] 
+0

謝謝你,這是一個很好的答案,因爲你對編碼有很多控制權。我編寫了自己的Encoder類來完成一個熱門編碼,Huffman編碼和索引編碼,但我也希望看到其他想法來保持一致性,並且不要讓大量的代碼亂七八糟,只爲定義編碼 – chase