首页 > 解决方案 > Pandas pivot_table 包括空身份

问题描述

数据集

x   y   a
1   3   0
1   1   0
1   2   0
3   6   0
5   3   1
1   5   0
1   7   0
1   6   0
1   4   0

可视化

网格大小= 8 x 12

![在此处输入图像描述

数据透视表

X = df.pivot(index='x',columns='y',values='a').values
X[np.isnan(X)] = 0

array([[0., 0., 1., 0., 1., 0., 0., 0.],
       [0., 1., 0., 0., 1., 0., 1., 0.],
       [0., 0., 0., 0., 1., 0., 0., 0.],
       [0., 1., 1., 1., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 1., 0., 0., 0.]])

这里数据透视表大小为 (8, 8) 但我希望 (8, 12) 将空行排除在数据透视表中。

标签: pythonarrayspandasnumpypivot

解决方案


尝试reindex

X = (df.pivot(index='x',columns='y', values='a')
   .fillna(0)
   .reindex(np.arange(12), axis=1, fill_value=0)
   .reindex(np.arange(8), fill_value=0)
)

输出:

y  0    1    2    3    4    5    6    7   8   9   10  11
x                                                       
0   0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   0   0   0   0
1   0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   0   0   0   0
2   0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   0   0   0   0
3   0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   0   0   0   0
4   0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   0   0   0   0
5   0  0.0  0.0  1.0  0.0  0.0  0.0  0.0   0   0   0   0
6   0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   0   0   0   0
7   0  0.0  0.0  0.0  0.0  0.0  0.0  0.0   0   0   0   0

还要考虑set_index().unstack()代替pivot

X = (df.set_index(['x','y'])
       ['a'].unstack(fill_value=0)
       .reindex(np.arange(12), axis=1, fill_value=0)
       .reindex(np.arange(8), fill_value=0)
    )

这为您提供了更好看的数据:

y  0   1   2   3   4   5   6   7   8   9   10  11
x                                                
0   0   0   0   0   0   0   0   0   0   0   0   0
1   0   0   0   0   0   0   0   0   0   0   0   0
2   0   0   0   0   0   0   0   0   0   0   0   0
3   0   0   0   0   0   0   0   0   0   0   0   0
4   0   0   0   0   0   0   0   0   0   0   0   0
5   0   0   0   1   0   0   0   0   0   0   0   0
6   0   0   0   0   0   0   0   0   0   0   0   0
7   0   0   0   0   0   0   0   0   0   0   0   0

推荐阅读