我的DF看起来像这样:
我想以某种矢量化的形式创建一个新的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列表,但这种方法可能很慢。有没有更好的办法?
答案 0 :(得分:1)
Pandas拥有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
答案 1 :(得分:1)
我认为对性能的担忧是次要的。首先,利用vector
与.str.split
一起制作您调用expand=True
的数据帧:
>>> 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
答案 2 :(得分: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_
- 列名称