【问题标题】:How to sort a Pandas DataFrame by date, in this specific way?如何以这种特定方式按日期对 Pandas DataFrame 进行排序?
【发布时间】:2020-10-11 18:02:22
【问题描述】:

我正在尝试按日期对 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 太大而无法暴力破解。

【问题讨论】:

标签: python pandas dataframe sorting date


【解决方案1】:

你需要的是 sort_values by year 和 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

【讨论】:

    【解决方案2】:

    在一行中:

    df.assign(yr=df.Date.dt.year,mo=df.Date.dt.month).sort_values(['yr','mo'],ascending=[False,True]).drop(['yr','mo'],axis=1)
    
        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
    

    【讨论】:

      猜你喜欢
      • 2019-08-02
      • 2018-05-18
      • 2016-09-14
      • 1970-01-01
      • 2013-12-06
      • 2018-08-22
      • 2020-03-08
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多