按星期几对Python DataFrame进行排序

时间:2016-02-19 01:15:26

标签: python python-3.x pandas dataframe

我尝试按索引中的星期几对数据框进行排序。我能够创建一个解决方法,我创建了一个额外的列,我手动将正确的订单值分配给然后排序。但必须有更好的方法,特别是当我处理可能更多的日期值时。

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 :(得分: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]