# 读取weightlifting数据集
weightlifting = pd.read_csv('data/weightlifting_men.csv')
weightlifting
|
Weight Category |
M35 35-39 |
M40 40-44 |
M45 45-49 |
M50 50-54 |
M55 55-59 |
M60 60-64 |
M65 65-69 |
M70 70-74 |
M75 75-79 |
M80 80+ |
0 |
56 |
137 |
130 |
125 |
115 |
102 |
92 |
80 |
67 |
62 |
55 |
1 |
62 |
152 |
145 |
137 |
127 |
112 |
102 |
90 |
75 |
67 |
57 |
2 |
69 |
167 |
160 |
150 |
140 |
125 |
112 |
97 |
82 |
75 |
60 |
3 |
77 |
182 |
172 |
165 |
150 |
135 |
122 |
107 |
90 |
82 |
65 |
4 |
85 |
192 |
182 |
175 |
160 |
142 |
130 |
112 |
95 |
87 |
70 |
5 |
94 |
202 |
192 |
182 |
167 |
150 |
137 |
120 |
100 |
90 |
75 |
6 |
105 |
210 |
200 |
190 |
175 |
157 |
142 |
122 |
102 |
95 |
80 |
7 |
105+ |
217 |
207 |
197 |
182 |
165 |
150 |
127 |
107 |
100 |
85 |
pandas.melt 使用参数:
pandas.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name='value', col_level=None)
参数解释:
frame:要处理的数据集。
id_vars:不需要被转换的列名。
value_vars:需要转换的列名,如果剩下的列全部都要转换,就不用写了。
var_name和value_name是自定义设置对应的列名。
col_level :如果列是MultiIndex,则使用此级别。
# 用melt方法,将sex_age放入一个单独的列
wl_melt = weightlifting.melt(id_vars='Weight Category',
var_name='sex_age',
value_name='Qual Total')
wl_melt.head()
|
Weight Category |
sex_age |
Qual Total |
0 |
56 |
M35 35-39 |
137 |
1 |
62 |
M35 35-39 |
152 |
2 |
69 |
M35 35-39 |
167 |
3 |
77 |
M35 35-39 |
182 |
4 |
85 |
M35 35-39 |
192 |
# 用split方法将sex_age列分为两列;
#expand表示是否把series类型转化为DataFrame类型
sex_age = wl_melt['sex_age'].str.split(expand=True)
sex_age.head()
|
0 |
1 |
0 |
M35 |
35-39 |
1 |
M35 |
35-39 |
2 |
M35 |
35-39 |
3 |
M35 |
35-39 |
4 |
M35 |
35-39 |
# 给列起名
sex_age.columns = ['Sex', 'Age Group']
sex_age.head()
|
Sex |
Age Group |
0 |
M35 |
35-39 |
1 |
M35 |
35-39 |
2 |
M35 |
35-39 |
3 |
M35 |
35-39 |
4 |
M35 |
35-39 |
# 只取出字符串中的M
sex_age['Sex'] = sex_age['Sex'].str[0]
sex_age.head()
|
Sex |
Age Group |
0 |
M |
35-39 |
1 |
M |
35-39 |
2 |
M |
35-39 |
3 |
M |
35-39 |
4 |
M |
35-39 |
# 用concat方法,将sex_age,与wl_cat_total连接起来
wl_cat_total = wl_melt[['Weight Category', 'Qual Total']]
wl_tidy = pd.concat([sex_age, wl_cat_total], axis='columns')
wl_tidy.head()
|
Sex |
Age Group |
Weight Category |
Qual Total |
0 |
M |
35-39 |
56 |
137 |
1 |
M |
35-39 |
62 |
152 |
2 |
M |
35-39 |
69 |
167 |
3 |
M |
35-39 |
77 |
182 |
4 |
M |
35-39 |
85 |
192 |
# 上面的结果也可以如下实现
cols = ['Weight Category', 'Qual Total']
sex_age[cols] = wl_melt[cols]