数据重塑,以及长宽数据的相互转化
stack 和 unstack方法
二重MultiIndex的Series可以unstack()成DataFrame。长数据变宽。
DataFrame可以stack成拥有二重MultiIndex的Series。如果是普通的多列 DataFrame ,调用一次 stack 后就会变成 Series 了。宽数据变长。
good_data_4.stack().unstack() #恢复了原来的样子
pivot方法
good_data_4.head()
Out[411]:
province id sex numbers
0 北京市 11 M 318380
1 北京市 11 F 167421
2 北京市 11 25343
3 北京市 11 N 115
4 天津市 12 M 216825
good_frame=pd.DataFrame(good_data_4.pivot(index='province',columns='sex',values='numbers').fillna(0)) # value 是关心的值,columns和index共同锁定了value的值。
good_frame.head()
Out[412]:
sex Na F M N
province
上海市 0.0 314555.0 576499.0 186.0
云南省 4899.0 53330.0 87002.0 0.0
内蒙古自治区 15038.0 138461.0 257813.0 0.0
北京市 25343.0 167421.0 318380.0 115.0
台湾省 0.0 1260.0 4516.0 0.0
pivot_table / groupby 方法
pivot 指定了新的index,如果是分组再应用函数,可使用pivot_table / groupby 。
#创建新的属性
mapping={
'北京市':'直辖市',
'天津市':'直辖市',
'上海市':'直辖市',
'重庆市':'直辖市'
}
f=lambda x : mapping.get(x, '非直辖市')
good_data_4['zxs']=good_data_4.province.map(f)
good_data_4.head()
#pivot_table
good_data_4.pivot_table(index='zxs',columns='sex',values='numbers',aggfunc=sum)
Out[432]:
sex F M N
zxs
直辖市 25343 625445 1151071 301
非直辖市 559508 5627190 10761872 2895
#group_by
good_data_4.groupby(['zxs','sex']).sum()
Out[433]:
numbers
zxs sex
直辖市 25343
F 625445
M 1151071
N 301
非直辖市 559508
F 5627190
M 10761872
N 2895