2015-12-05 90 views
0

的名字列我有一個DF,看起來像這樣:發現在DF和擴大DF大熊貓細胞獨特的元素,包括與這些獨特的元素

enter image description here

我想創建一個新的DF,讓我們說instrumentsDF,在某種量化的形式,所以我得到這樣的:

0  Piano Guitar Viola 
0  0  0  1 
1  0  1  0 
2  1  0  1 
3  0  1  0 
4  1  1  1 

我不知道有多少獨特favored_instruments在細胞中,這意味着我不知道有多少我列將在新的DF中擁有。

我的代碼到目前爲止是這樣的,但不能想着如何擴大到輸出什麼,我需要:

crunk = lambda x: pd.Series([i for i in reversed(x.split(','))]) 
vector = compDf['favored_instrument'].apply(crunk) 
print vector 

將會產生這樣的:

 0   1  2 
0  Piano  NaN  NaN 
1  Piano  NaN  NaN 
2  Piano  NaN  NaN 
3  Guitar  Piano NaN 
4  Piano  NaN  NaN 

我可以嘗試迭代在DF的每一行上,用','分割值並添加到python列表中,但這種方法可能會很慢。有沒有更好的辦法?

回答

1

我認爲對性能的擔憂是次要的。首先,讓你通過利用.str.splitexpand=True稱爲vector數據框:

>>> df 
    favoured_instrument 
0     Piano 
1     Viola 
2   Viola, Piano 
3    Guitar 
4 Piano, Guitar, Viola 
>>> d2 = df["favoured_instrument"].str.split("\s*,\s*", expand=True) 
>>> d2 
     0  1  2 
0 Piano None None 
1 Viola None None 
2 Viola Piano None 
3 Guitar None None 
4 Piano Guitar Viola 

,然後我們可以在許多方面轉動此。使用get_dummies,例如:

>>> pd.get_dummies(d2.stack()).groupby(level=0).sum() 
    Guitar Piano Viola 
0  0  1  0 
1  0  0  1 
2  0  1  1 
3  1  0  0 
4  1  1  1 
+0

好的答案DSM!非常感謝你。乾杯 –

0

sklearn.preprocessing.LabelBinarizer可能是非常有用的

簡單的例子:

from sklearn import preprocessing 
lb= preprocessing.LabelBinarizer() 
lb.fit_transform(['Piano', 'Piano', 'Guitar', 'Viola', 'Viola', 'Guitar']) 

結果:

array([[0, 1, 0], 
     [0, 1, 0], 
     [1, 0, 0], 
     [0, 0, 1], 
     [0, 0, 1], 
     [1, 0, 0]]) 

lb.classes_ - 列名

+0

謝謝Alexey。如果我知道所有unique_instruments,您的解決方案將工作。它們都以不同的組合捆綁在一起,沒有特定的順序,但用逗號分隔。 –

1

大熊貓有get_dummies功能:

>>> import pandas as pd 
>>> data = pd.DataFrame({'instrument': ['Piano', 'Piano', 'Guitar', 'Viola', 'Viola', 'Guitar']}) 

>>> pd.get_dummies(data['instrument']) 
    instrument_Guitar instrument_Piano instrument_Viola 
0     0     1     0 
1     0     1     0 
2     1     0     0 
3     0     0     1 
4     0     0     1 
5     1     0     0 
+0

謝謝,但您的解決方案假定我知道DF中的所有獨特儀器 –