[英]Finding unique elements in cells of pandas DF and expanding DF to include columns with the names of those unique elements
我有一个看起来像这样的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列表中,但是这种方法可能很慢。 有没有更好的办法?
熊猫具有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
我认为对性能的担心是次要的。 首先,通过利用expand=True
的.str.split
来使您称为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
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_
列名
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.