2016-02-19 51 views
1

日我試圖在本週該指數一天我的數據幀進行排序。我能夠創建一個解決方法,我創建了一個額外的列,我手動分配正確的訂單值,然後排序。但是必須有更好的方法,尤其是當我處理更多日期值時。排序Python的數據幀由

dict = {'Monday': Monday/MonCount, 'Tuesday': Tuesday/TueCount, 'Wednesday': Wednesday/WedCount, 'Thursday': Thursday/ThuCount, 'Friday': Friday/FriCount} 
df = pd.Series(dict, name='DailyValue') 
dff = DataFrame(df) 
dff['Day'] = dff.index 
dff['Sorter'] = [5,1,4,2,3] 

dff.sort_values(by = ['Sorter'], inplace = True) 
#dff.sort(['Day'], ascending = True) 

dff.plot(kind='bar', grid = True, y = ['DailyValue']) 
plt.show() 

回答

1

您可以使用列表解析生成工作日(即0-6)的索引,然後創建這些值的系列。您按照這些週日價值對這個系列進行排序並採用索引。然後,您使用ix根據此排序索引爲您的原始序列編制索引。

import numpy as np 
import pandas as pd 

s = pd.Series(np.random.randn(14), index=pd.date_range('2016-1-1', periods=14)) 

s 
Out[34]: 
2016-01-01 0.915488 
2016-01-02 -1.053409 
2016-01-03 -1.826033 
2016-01-04 0.559250 
2016-01-05 -0.278086 
2016-01-06 0.041113 
2016-01-07 1.076463 
2016-01-08 0.942720 
2016-01-09 -0.850388 
2016-01-10 -0.649713 
2016-01-11 2.769957 
2016-01-12 0.498103 
2016-01-13 1.098085 
2016-01-14 0.699077 
Freq: D, dtype: float64 

idx = pd.Series([d.weekday() for d in s.index]).sort_values().index 

s.ix[idx] 
Out[36]: 
2016-01-04 0.559250 
2016-01-11 2.769957 
2016-01-05 -0.278086 
2016-01-12 0.498103 
2016-01-06 0.041113 
2016-01-13 1.098085 
2016-01-07 1.076463 
2016-01-14 0.699077 
2016-01-01 0.915488 
2016-01-08 0.942720 
2016-01-02 -1.053409 
2016-01-09 -0.850388 
2016-01-03 -1.826033 
2016-01-10 -0.649713 
dtype: float64 

作爲一個襯墊...

s_new = s.ix[pd.Series([d.weekday() for d in s.index]).sort_values().index] 

完全一樣的數據幀。

df_new = df.ix[pd.Series([d.weekday() for d in df.index]).sort_values().index] 
+0

這是有道理的。謝謝。 Series()和DataFrame()函數之間的最終產品有差異嗎? – Evy555

+0

號正是基於索引,所以它應該工作的罰款爲任何一個數據幀或一個系列。 – Alexander