首页 > 解决方案 > 如何以这种特定方式按日期对 Pandas DataFrame 进行排序?

问题描述

我正在尝试按日期对 Pandas DataFrame 进行排序,但我不希望它们纯粹升序或降序,因此df.sort_values(by=['Date'], ascending=False)不会产生我正在寻找的结果。

我的数据框看起来像:

df = pd.DataFrame({'Date':[date(2017,1,1),date(2019,2,1),date(2018,4,1),date(2017,3,1),date(2018,3,1)],'Count':[6,8,4,14,9],'Percentage':[0.02,0.62,0.41,0.36,0.39]})

    Date        Count   Percentage
0   2017-01-01  6       0.02
1   2019-02-01  8       0.62
2   2018-04-01  4       0.41
3   2017-03-01  14      0.36
4   2018-03-01  9       0.39

我想按日期对 DataFrame 进行排序,以便每个月按升序排列,而年份本身按降序排列。用文字表达很棘手,但期望的输出希望能更好地解释。

期望的输出:

    Date        Count   Percentage
0   2019-02-01  8       0.62
1   2018-03-01  9       0.39
2   2018-04-01  4       0.41
3   2017-01-01  6       0.02
4   2017-03-01  14      0.36

如您所见,我想要的输出不是严格的升序或降序。必须存在我需要的相对有效的解决方案,因为我的实际 DataFrame 对于蛮力来说太大了。

标签: pythonpandasdataframesortingdate

解决方案


你需要的是sort_valuesyear 和 Month ,但是 Year 升序, Month 降序

df['Month']=df.Date.dt.month
df['Year']=df.Date.dt.year
df=df.sort_values(['Year','Month'],ascending=[False,True])
df=df.drop(['Year','Month'], axis=1)
df
        Date  Count  Percentage
1 2019-02-01      8        0.62
4 2018-03-01      9        0.39
2 2018-04-01      4        0.41
0 2017-01-01      6        0.02
3 2017-03-01     14        0.36

推荐阅读