将每列值拆分为不同的列
Splitting a each column value into different columns
我有一个调查回复 sheet,其中的问题可以有多个答案,使用一组复选框进行选择。
当我从响应 sheet 中获取数据并将其导入 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 中是否有一种简单的方法可以将这种数据框转换成一个包含多个列的数据框,分别称为运动-足球、运动-排球、运动-篮球,其中每一个都是布尔值 ( 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 个。
问题是分隔符 ,\s*
,所以解决方案是添加 str.split
with str.join
before 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
我有一个调查回复 sheet,其中的问题可以有多个答案,使用一组复选框进行选择。
当我从响应 sheet 中获取数据并将其导入 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 中是否有一种简单的方法可以将这种数据框转换成一个包含多个列的数据框,分别称为运动-足球、运动-排球、运动-篮球,其中每一个都是布尔值 ( 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 个。
问题是分隔符 ,\s*
,所以解决方案是添加 str.split
with str.join
before 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