2015-11-08 37 views
0

這裏是我心目中的問題,給定一個表如何分割一列到多列和計算頻率

Id type 
0 1 [a,b] 
1 2  [c] 
2 3  [a,d] 

我想把它轉換成形式:

Id  a b c d 
0 1  1 1 0 0 
1 2  0 0 1 0 
2 3  1 0 0 1 

我需要一個非常有效的方式來轉換大型表格。歡迎任何評論。

====================================

我已經收到了一些很好的答案,非常感謝你的幫助。

現在出現了一個新問題,這是我的筆記本電腦內存不足以通過使用pd.dummies生成整個數據幀。

有無論如何生成一個行和堆棧然後在一起的稀疏矢量?

+0

您是否知道'''事先可能發生的所有可能的值? – shanmuga

+0

@shanmuga,是的,我可以事先快速計算所有不同的類型 –

+0

您的'type'列是由字符串還是字符串列表組成? – DSM

回答

1

試試這個

>>> df 
    Id type 
0 1 [a, b] 
1 2  [c] 
2 3 [a, d] 
>>> df2 = pd.DataFrame([x for x in df['type'].apply(
...   lambda item: dict(map(
...         lambda x: (x,1), 
...        item)) 
...   ).values]).fillna(0) 
>>> df2.join(df) 
    a b c d Id type 
0 1 1 0 0 1 [a, b] 
1 0 0 1 0 2  [c] 
2 1 0 0 1 3 [a, d] 

它基本上列表的列表轉換爲字典的名單和構建一個DataFrame out of this

[ ['a', 'b'], ['c'], ['a', 'd'] ] # list of list
[ {'a':1, 'b':1}, {'c':1}, {'a':1, 'd':1} ] # list of dict Make DataFrame out of this

+0

@ 3c。您的數據有多大?有多少行和不同值對於類型?我測試它有100萬行和4個不同的值,它在4-6秒內完成。 – shanmuga

+0

40,000行,約7000列。這張表不應該很大,但是當我使用'pd.get_dummies' –

+0

@ 3c時,我的4G內存筆記本電腦的內存不足。 4GB應該足以處理這個問題。如果你遇到內存錯誤,你的代碼需要更多的優化。 – shanmuga

1

試試這個:

pd.get_dummies(df.type.apply(lambda x: pd.Series([i for i in x]))) 

解釋:

df.type.apply(lambda x: pd.Series([i for i in x] 

讓你的索引位置的列在你的清單。然後,您可以使用get dummies讓每個值的計數

pd.get_dummies(df.type.apply(lambda x: pd.Series([i for i in x]))) 

輸出:

a c b d 
0 1 0 1 0 
1 0 1 0 0 
2 1 0 0 1 
+0

這真的很簡潔,很好。非常感謝。唯一的問題是我的電腦內存不足。也許我可以切換到16GB內存的桌面,或者我可以將虛擬矩陣存儲爲稀疏形式嗎? –

+0

如果它是一個字符串,而不是一個列表,那麼你可以使用字符串方法'split()'。我已將它添加到答案中(您可能需要先處理方括號 – JAB

+1

@JAB,您可以通過將代碼修改爲'df.type.apply(lambda x:pd.Series([1] * len (x),index = x))' – shanmuga