2015-12-05 55 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中的所有独特仪器 –