为了账号安全,请及时绑定邮箱和手机立即绑定

Pandas DataFrame.unstack()更改行和列标题的顺序

Pandas DataFrame.unstack()更改行和列标题的顺序

侃侃无极 2021-03-29 17:05:29
我遇到了以下对行标题和列标题进行排序的问题。这是重现此方法的方法:X =pd.DataFrame(dict(x=np.random.normal(size=100), y=np.random.normal(size=100)))A=pd.qcut(X['x'], [0,0.25,0.5,0.75,1.0]) #create a factorB=pd.qcut(X['y'], [0,0.25,0.5,0.75,1.0]) # create another factorg = X.groupby([A,B])['x'].mean() #do a two-way bucketingprint g #this gives the following and so far so goodx                 y               [-2.315, -0.843]  [-2.58, -0.567]    -1.041167                  (-0.567, 0.0321]   -1.722926                  (0.0321, 0.724]    -1.245856                  (0.724, 3.478]     -1.240876(-0.843, -0.228]  [-2.58, -0.567]    -0.576264                  (-0.567, 0.0321]   -0.501709                  (0.0321, 0.724]    -0.522697                  (0.724, 3.478]     -0.506259(-0.228, 0.382]   [-2.58, -0.567]     0.175768                  (-0.567, 0.0321]    0.214353                  (0.0321, 0.724]     0.113650                  (0.724, 3.478]     -0.013758(0.382, 2.662]    [-2.58, -0.567]     0.983807                  (-0.567, 0.0321]    1.214640                  (0.0321, 0.724]     0.808608                  (0.724, 3.478]      1.515334Name: x, dtype: float64#Now let's make a two way table and here is the problem:HTML(g.unstack().to_html())由此可见:y                 (-0.567, 0.0321]  (0.0321, 0.724]  (0.724, 3.478]  [-2.58, -0.567]x                                                                                   (-0.228, 0.382]           0.214353         0.113650       -0.013758         0.175768(-0.843, -0.228]         -0.501709        -0.522697       -0.506259        -0.576264(0.382, 2.662]            1.214640         0.808608        1.515334         0.983807[-2.315, -0.843]         -1.722926        -1.245856       -1.240876        -1.041167请注意标头如何不再排序。我想知道什么是解决此问题的好方法,以使交互式工作变得容易。若要进一步查找问题出在哪里,请运行以下命令:g.unstack().columns它给了我这个:Index([((-0.567,0.0321],(0.0321,0.724],(0.724,3.478],[-2.58,-0.567]],dtype = object)行和列标签的排序均不正确。
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

这似乎有点骇人听闻,但这里有:


In [11]: g_unstacked = g.unstack()


In [12]: g_unstacked

Out[12]:

y                 (-0.565, 0.12]  (0.12, 0.791]  (0.791, 2.57]  [-2.177, -0.565]

x

(-0.068, 0.625]         0.389408       0.267252       0.283344          0.258337

(-0.892, -0.068]       -0.121413      -0.471889      -0.448977         -0.462180

(0.625, 1.639]          0.987372       1.006496       0.830710          1.202158

[-3.124, -0.892]       -1.513954      -1.482813      -1.394198         -1.756679

利用unique保留顺序*的事实(从g的索引中获取唯一的第一项):


In [13]: g.index.get_level_values(0).unique()

Out[13]:

array(['[-3.124, -0.892]', '(-0.892, -0.068]', '(-0.068, 0.625]',

       '(0.625, 1.639]'], dtype=object)

如您所见,它们的顺序正确。


现在,您可以reindex这样:


In [14]: g_unstacked.reindex(g.index.get_level_values(0).unique())

Out[14]:

y                 (-0.565, 0.12]  (0.12, 0.791]  (0.791, 2.57]  [-2.177, -0.565]

[-3.124, -0.892]       -1.513954      -1.482813      -1.394198         -1.756679

(-0.892, -0.068]       -0.121413      -0.471889      -0.448977         -0.462180

(-0.068, 0.625]         0.389408       0.267252       0.283344          0.258337

(0.625, 1.639]          0.987372       1.006496       0.830710          1.202158

现在顺序正确。


更新(我错过了列也没有顺序)。

您可以对列使用相同的技巧(必须链接这些操作):


In [15]: g_unstacked.reindex_axis(g.index.get_level_values(1).unique(), axis=1)

*这是系列独有的速度明显快的原因np.unique。


查看完整回答
反对 回复 2021-04-02
  • 2 回答
  • 0 关注
  • 429 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号