首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将每个列值拆分为不同的列

将每个列值拆分为不同的列
EN

Stack Overflow用户
提问于 2019-01-17 09:40:18
回答 1查看 258关注 0票数 3

我有一个调查问卷,其中有问题,可以有多个答案,选择使用一组复选框。

当我从响应表中获取数据并将其导入熊猫时,我得到了以下信息:

代码语言:javascript
复制
             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表示否)?我想不出明智的办法来做这件事

我需要的是一个新的数据,它看起来像这样(和年龄列)-

代码语言:javascript
复制
          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

我试过了直到这一点不能再继续下去了。

代码语言:javascript
复制
df['Sports you like'].str.split(',\s*')

这分为不同的列,但第一列可能有任何运动,我只需要一个在第一栏,如果用户喜欢足球或0。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-17 09:56:44

问题是分隔符,\s*,因此解决方案是在str.get_dummies之前添加带有str.joinstr.join

代码语言:javascript
复制
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  

或者使用MultiLabelBinarizer

代码语言:javascript
复制
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  
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54232950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档