6

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上方FriYes左侧No,我会怎么做?

4

3 回答 3

4

使用pandas 0.15 中引入的Categories,可以将 'day' 和 'smoker' 列转换为具有预定义顺序的类别。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
于 2017-08-25T17:34:46.017 回答
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

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

于 2013-08-12T16:05:41.857 回答
0

我最终使用了与克劳德先生不同的技巧:命名我的日子

[
'      Mon',
'     Tue',
'    Wed',
'   Thu',
'  Fri',
' Sat',
'Sun']
于 2013-08-13T16:27:31.933 回答