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”之后,我将如何解决这个问题?
答案 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']