交叉表是一种特殊的透视表,典型的用途如分组统计,如现在想要统计关于街道和性别分组的频数:
print(pd.crosstab(index=df['Address'],columns=df['Gender']))
交叉表的功能也很强大(但目前还不支持多级分组),下面说明一些重要参数:
① values和aggfunc:分组对某些数据进行聚合操作,这两个参数必须成对出现。默认参数等于如下方法:pd.crosstab(index=df[‘Address’],columns=df[‘Gender’],values=1,aggfunc=‘count’)
② 除了边际参数margins外,还引入了normalize参数,可选’all’,‘index’,'columns’参数值
print(pd.crosstab(index=df['Address'],columns=df['Gender']))
print(pd.crosstab(index=df['Address'],columns=df['Gender'],
values=np.random.randint(1,20,df.shape[0]),aggfunc='min'))
print(pd.crosstab(index=df['Address'],columns=df['Gender'],normalize='all',margins=True))
Gender F M
Address
street_1 1 2
street_2 4 2
street_4 3 5
street_5 3 3
street_6 5 1
street_7 3 3
Gender F M
Address
street_1 6 1
street_2 5 7
street_4 1 3
street_5 9 2
street_6 1 10
street_7 2 12
Gender F M All
Address
street_1 0.028571 0.057143 0.085714
street_2 0.114286 0.057143 0.171429
street_4 0.085714 0.142857 0.228571
street_5 0.085714 0.085714 0.171429
street_6 0.142857 0.028571 0.171429
street_7 0.085714 0.085714 0.171429
All 0.542857 0.457143 1.000000
三、melt函数
melt函数可以认为是pivot函数的逆操作,将unstacked状态的数据,压缩成stacked,使“宽”的DataFrame变“窄”。
melt函数中的id_vars表示需要保留的列,value_vars表示需要stack的一组列。
```python
df_m = df[['ID','Gender','Math']]
print(df_m.head())
pivoted = df.pivot(index='ID',columns='Gender',values='Math')
result = pivoted.reset_index().melt(id_vars=['ID'],value_vars=['F','M'],value_name='Math').dropna().set_index('ID').sort_index()
print(result.head())
ID Gender Math
0 1101 M 34.0
1 1102 F 32.5
2 1103 M 87.2
3 1104 F 80.4
4 1105 F 84.8
Gender Math
ID
1101 M 34.0
1102 F 32.5
1103 M 87.2
1104 F 80.4
1105 F 84.8
True