重新排序pivot_table的列/行?

时间:2013-08-12 14:43:34

标签: python pandas pivot-table

pandas的pivot_table似乎只按字母顺序返回列,例如

pivot_table(tips,'tip_pct',rows = ['sex','day'],cols ='smoker',aggfunc = len)

给出:

  smoker     No  Yes
sex    day          
Female Fri   2   7  
       Sat   13  15
       Sun   14  4  
       Thur  25  7  
Male   Fri   2   8  
       Sat   32  27
       Sun   43  15
       Thur  20  10 

如果我想将“Thur”置于“Fri”之上,而将“Yes”置于“No”之后,我将如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

为这些变量指定虚拟值,然后使用这些值对轴上的帧进行排序。这肯定是一个黑客。

In [47]: list_of_days = ['Mon', 'Tues', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']

In [48]: ri = df.reset_index()

In [49]: day = np.unique(ri.day)

In [50]: day_index = [list_of_days.index(d) for d in day]

In [51]: ri['day_index'] = day_index

In [52]: ri
Out[52]:
   day_index     sex   day  no  yes
0          4  female   Fri   1   47
1          5  female   Sat  42   16
2          6  female   Sun  15   48
3          3  female  Thur  15   49
4          4    male   Fri  48   42
5          5    male   Sat  41   14
6          6    male   Sun   6   36
7          3    male  Thur   9   20

In [53]: ri.sort(['sex', 'day_index', 'day']).set_index(['sex', 'day']).drop('day_index', axis=1)
Out[53]:
             no  yes
sex    day
female Thur  15   49
       Fri    1   47
       Sat   42   16
       Sun   15   48
male   Thur   9   20
       Fri   48   42
       Sat   41   14
       Sun    6   36

我只展示了索引的解决方案,但对于列,你可以做类似的事情。

答案 1 :(得分:1)

使用Categories,在pandas 0.15中引入,' day'和吸烟者'列可以转换为具有预定义顺序的类别。 pivot_table()会对它们进行排序。

>>> pt = pd.pivot_table(df, 'tip_pct', index=['sex', 'day'], columns='smoker', aggfunc=pd.np.sum)

smoker      No  Yes
sex    day         
Female Fri   0    4
       Sat   0    5
       Sun   0    5
       Thu   9    3
Male   Fri   0    4
       Sat   1    5
       Sun   1    5
       Thu   9    3

>>> df["day"] = df["day"].astype('category', categories=["Thu", "Fri", "Sat", "Sun"])
>>> df["smoker"] = df["smoker"].astype('category', categories = ["Yes", "No"])
>>> pt = pd.pivot_table(df, 'tip_pct', index=['sex', 'day'], columns='smoker', aggfunc=pd.np.sum)

smoker      Yes  No
sex    day         
Female Thu    3   9
       Fri    4   0
       Sat    5   0
       Sun    5   0
Male   Thu    3   9
       Fri    4   0
       Sat    5   1
       Sun    5   1

答案 2 :(得分:0)

我最终使用了与Cloud先生不同的黑客:命名我的日子

[
'      Mon',
'     Tue',
'    Wed',
'   Thu',
'  Fri',
' Sat',
'Sun']