【问题标题】:Splitting a each column value into different columns [duplicate]将每列值拆分为不同的列[重复]
【发布时间】:2019-01-17 09:40:18
【问题描述】:

我有一个调查回复表,其中包含可以有多个答案的问题,使用一组复选框进行选择。

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

             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*')

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

【问题讨论】:

  • 如果我的分隔符同时是 ', ' 和 ',' 怎么办。在某些行中,逗号后有一个空格,逗号后只有一个值。比如这个 Football, ChessFootball, Cycling 。那么我的分隔符应该等于什么 - pd.concat([df['Id'], df['Sports you like'].str.get_dummies(sep=",")], axis=1 我应该使用正则表达式吗? @jezrael
  • 你是对的,所以重新打开并添加解决方案。
  • 标记的重复处理正则表达式,即同时被','', '分割。

标签: python-3.x pandas google-forms


【解决方案1】:

问题是分隔符,\s*,因此解决方案是在str.get_dummies 之前添加str.splitstr.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  

或者使用MultiLabelBinarizer:

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  

【讨论】:

  • 谢谢@jezrael。非常感谢您的回复。
  • @Sumanth - 欢迎您!如果我的回答有帮助,请不要忘记accept。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-12-03
  • 2014-02-05
  • 2017-05-12
  • 2020-09-16
  • 1970-01-01
  • 2022-12-21
  • 2018-05-26
  • 2018-11-16
相关资源
最近更新 更多