2013-04-12 202 views
1

當我使用排序若干列(['Symbol','Year','Month','Day'])所產生的數據幀由Symbol > Year > Month排序不通過Day我的數據框:意外的結果排序

In [1]: df = pd.DataFrame({'Symbol': {79: 'F', 81: 'F', 82: 'F', 83: 'F', 84: 'F', 85: 'F', 86: 'F', 87: 'F', 89: 'F'}, 'Shares': {79: 100, 81: 100, 82: 100, 83: 100, 84: 100, 85: 100, 86: 100, 87: 100, 89: 100}, 'Month': {79: '08', 81: '08', 82: '08', 83: '08', 84: '08', 85: '08', 86: '08', 87: '08', 89: '09'}, 'Year': {79: '2008', 81: '2008', 82: '2008', 83: '2008', 84: '2008', 85: '2008', 86: '2008', 87: '2008', 89: '2008'}, 'Action': {79: 'Sell', 81: 'Sell', 82: 'Buy', 83: 'Sell', 84: 'Buy', 85: 'Sell', 86: 'Buy', 87: 'Sell', 89: 'Sell'}, 'Day': {79: 2L, 81: 4L, 82: '06', 83: 11L, 84: '13', 85: 18L, 86: '18', 87: 23L, 89: 22L}}) 

In [2]: df 
Out[2]: 
    Action Day Month Shares Symbol Year 
79 Sell 2 08  100  F 2008 
81 Sell 4 08  100  F 2008 
82 Buy 06 08  100  F 2008 
83 Sell 11 08  100  F 2008 
84 Buy 13 08  100  F 2008 
85 Sell 18 08  100  F 2008 
86 Buy 18 08  100  F 2008 
87 Sell 23 08  100  F 2008 
89 Sell 22 09  100  F 2008 

In [3]: df.sort(['Symbol','Year','Month','Day']) 
Out[3]: 
    Action Day Month Shares Symbol Year 
79 Sell 2 08  100  F 2008 
81 Sell 4 08  100  F 2008 
83 Sell 11 08  100  F 2008 
85 Sell 18 08  100  F 2008 
87 Sell 23 08  100  F 2008 
82 Buy 06 08  100  F 2008 
84 Buy 13 08  100  F 2008 
86 Buy 18 08  100  F 2008 
89 Sell 22 09  100  F 2008 

爲什麼不sort按預期工作?

+0

您是否可以編輯您的文章以包含您擁有的最小再現案例(以及提及您使用的是哪個版本的熊貓)? – DSM

+0

據此編輯。謝謝。 –

+1

看起來像你正在使用不同的名稱進行排序比在你的列標題 – zach

回答

1

由於天數存儲爲混合類型(字符串和長度),並且由於字符串比python中的「大於」數字(排序看起來像是出乎意料地行事),所以它不像您期望的那樣工作。

您可以通過apply此列整數轉換-ing int

df['Day'] = df['Day'].apply(int) 

我會考慮這樣做的月和年過,因爲在你的數據幀,這些都是字符串(也許會更有意義爲INT):

df['Mo.'] = df['Mo.'].apply(int) 
df['Year'] = df['Year'].apply(int) 

然後你可以sort白天:

In [11]: df.sort(['Day']) 
Out[11]: 
    Indx Year Mo. Day Sym Action Shares 
0 79 2008 8 2 F Sell  100 
1 81 2008 8 4 F Sell  100 
5 82 2008 8 6 F Buy  100 
2 83 2008 8 11 F Sell  100 
6 84 2008 8 13 F Buy  100 
3 85 2008 8 18 F Sell  100 
7 86 2008 8 18 F Buy  100 
8 89 2008 9 22 F Sell  100 
4 87 2008 8 23 F Sell  100 

或排序多列:

In [12]: df.sort(['Mo.', 'Day']) 
Out[12]: 
    Indx Year Mo. Day Sym Action Shares 
0 79 2008 8 2 F Sell  100 
1 81 2008 8 4 F Sell  100 
5 82 2008 8 6 F Buy  100 
2 83 2008 8 11 F Sell  100 
6 84 2008 8 13 F Buy  100 
3 85 2008 8 18 F Sell  100 
7 86 2008 8 18 F Buy  100 
4 87 2008 8 23 F Sell  100 
8 89 2008 9 22 F Sell  100 

In [13]: df.sort(['Day', 'Mo.']) 
Out[13]: 
    Indx Year Mo. Day Sym Action Shares 
0 79 2008 8 2 F Sell  100 
1 81 2008 8 4 F Sell  100 
5 82 2008 8 6 F Buy  100 
2 83 2008 8 11 F Sell  100 
6 84 2008 8 13 F Buy  100 
3 85 2008 8 18 F Sell  100 
7 86 2008 8 18 F Buy  100 
8 89 2008 9 22 F Sell  100 
4 87 2008 8 23 F Sell  100 

並與ascending說法:

In [14]: df.sort(['Mo.', 'Day'], ascending=[True, False]) 
Out[14]: 
    Indx Year Mo. Day Sym Action Shares 
4 87 2008 8 23 F Sell  100 
3 85 2008 8 18 F Sell  100 
7 86 2008 8 18 F Buy  100 
6 84 2008 8 13 F Buy  100 
2 83 2008 8 11 F Sell  100 
5 82 2008 8 6 F Buy  100 
1 81 2008 8 4 F Sell  100 
0 79 2008 8 2 F Sell  100 
8 89 2008 9 22 F Sell  100 

...將正常工作。

+0

當我嘗試這段代碼時,我最終會得到與你相同的輸出,除了「Sell」是第一個。 –

+0

@ErikGibbons有趣...因爲帝斯曼建議我認爲你的數據閱讀方式有點可疑(你使用的是read_csv)嗎? df.dtypes和/或df.to_dict()的輸出可能會有所幫助:) –

+0

@AndyHayden:現在我們已經看到了'.to_dict()',你想要它嗎? – DSM