我有一个调查问卷,其中有问题,可以有多个答案,选择使用一组复选框。
当我从响应表中获取数据并将其导入熊猫时,我得到了以下信息:
Timestamp Sports you like Age
0 23/11/2013 13:22:30 Football, Chess, Cycling 15
1 23/11/2013 13:22:34 Football 25
2 23/11/2013 13:22:39 Swimming,Football 22
3 23/11/2013 13:22:45 Chess, Soccer 27
4 23/11/2013 13:22:48 Soccer 30体育栏目中可以有任意数量的体育价值(还有篮球、排球等)。还有一些,其他列,。我想统计一下这个问题的结果(有多少人喜欢足球等等)。问题是,所有答案都在一列中,所以按该列分组并要求计数是行不通的。
在Pandas中是否有一种简单的方法可以将这种数据帧转换成一个包含多个列的“体育-足球”、“体育-排球”、“体育-篮球”,每一列都是布尔型的(1表示是,0表示否)?我想不出明智的办法来做这件事
我需要的是一个新的数据,它看起来像这样(和年龄列)-
Timestamp Sports-Football Sports-Chess Sports-Cycling ....
0 23/11/2013 13:22:30 1 1 1
1 23/11/2013 13:22:34 1 0 0
2 23/11/2013 13:22:39 1 0 0
3 23/11/2013 13:22:45 0 1 0我试过了直到这一点不能再继续下去了。
df['Sports you like'].str.split(',\s*')这分为不同的列,但第一列可能有任何运动,我只需要一个在第一栏,如果用户喜欢足球或0。
发布于 2019-01-17 09:56:44
问题是分隔符,\s*,因此解决方案是在str.get_dummies之前添加带有str.join的str.join。
df1 = (df.pop('Sports you like').str.split(',\s*')
.str.join('|')
.str.get_dummies()
.add_prefix('Sports-'))
df = df.join(df1)
print (df)
Timestamp Age Sports-Chess Sports-Cycling Sports-Football \
0 23/11/2013 13:22:30 15 1 1 1
1 23/11/2013 13:22:34 25 0 0 1
2 23/11/2013 13:22:39 22 0 0 1
3 23/11/2013 13:22:45 27 1 0 0
4 23/11/2013 13:22:48 30 0 0 0
Sports-Soccer Sports-Swimming
0 0 0
1 0 0
2 0 1
3 1 0
4 1 0 from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
s = df.pop('Sports you like').str.split(',\s*')
df1 = pd.DataFrame(mlb.fit_transform(s),columns=mlb.classes_).add_prefix('Sports-')
print (df1)
Sports-Chess Sports-Cycling Sports-Football Sports-Soccer \
0 1 1 1 0
1 0 0 1 0
2 0 0 1 0
3 1 0 0 1
4 0 0 0 1
Sports-Swimming
0 0
1 0
2 1
3 0
4 0
df = df.join(df1)
print (df)
Timestamp Age Sports-Chess Sports-Cycling Sports-Football \
0 23/11/2013 13:22:30 15 1 1 1
1 23/11/2013 13:22:34 25 0 0 1
2 23/11/2013 13:22:39 22 0 0 1
3 23/11/2013 13:22:45 27 1 0 0
4 23/11/2013 13:22:48 30 0 0 0
Sports-Soccer Sports-Swimming
0 0 0
1 0 0
2 0 1
3 1 0
4 1 0 https://stackoverflow.com/questions/54232950
复制相似问题