我有一个问卷调查表,其中包含可以使用一组复选框选择的多个答案的问题。
当我从响应表中获取数据并将其导入大熊猫时,我得到了:
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中是否有一种简单的方法可以将这种数据框转换为一个包含多个列的字段,这些列称为Sports-Football,Sports-Volleyball,Sports-Basketball,而每个列都是布尔值(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*')
分为不同的列,但第一列可能有任何运动,如果用户喜欢Football或0,则第一列只需1。
答案 0 :(得分:2)
问题是分隔符,\s*
,所以解决方案是在str.split
之前将str.join
和str.get_dummies
加起来:
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