【问题标题】:Sort DataFrame by a datetime object from Jan to dec按从 Jan 到 dec 的日期时间对象对 DataFrame 进行排序
【发布时间】:2020-06-23 12:47:34
【问题描述】:

我有一个数据框。使用 pandas groupby 聚合数据框:

df.groupby(["Date", "company"]).producttyp.size().reset_index()

结果如下表所示

      Date       company      producttyp
0   Apr-2020      proA1         15
1   Apr-2020      proB1         6
2   Apr-2020      probCC        12
3   Apr-2020      prouba        18
4   Feb-2020      pWC           4
5   Feb-2020      pCA           4
6   Feb-2020      prosu         3
7   Jan-2020      proku         11
8   Jan-2020      proyu         5
9   Jan-2020      prose         2
10  Mar-2020      proud         10
11  Mar-2020      pride         7
12  Mar-2020      proza         6
13  May-2020      proVVaG       40
14  May-2020      proAG         13
15  May-2020      proG          41
16  May-2020      PKWC          18

我希望根据Date 列对DataFrame 进行排序。有什么解决办法吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe pandas-groupby


    【解决方案1】:

    使用 pd.to_datetimeDate 列转换为 pandas 日期时间序列,并将其分配给分组 df 中的临时列,然后使用 DataFrame.sort_values 对此临时列上的数据帧进行排序,最后使用 @987654323 @删除这个临时列:

    df = (
        df.assign(temp=pd.to_datetime(df['Date'], format='%b-%Y'))
        .sort_values(by='temp', ignore_index=True)
        .drop('temp', 1)
    )
    

    结果:

    # print(df)
    
            Date  company  producttyp
    0   Jan-2020    proyu           5
    1   Jan-2020    proku          11
    2   Jan-2020    prose           2
    3   Feb-2020      pWC           4
    4   Feb-2020      pCA           4
    5   Feb-2020    prosu           3
    6   Mar-2020    proza           6
    7   Mar-2020    pride           7
    8   Mar-2020    proud          10
    9   Apr-2020    proA1          15
    10  Apr-2020   prouba          18
    11  Apr-2020   probCC          12
    12  Apr-2020    proB1           6
    13  May-2020  proVVaG          40
    14  May-2020    proAG          13
    15  May-2020     proG          41
    16  May-2020     PKWC          18
    

    【讨论】:

      【解决方案2】:

      这是使用pd.to_datetime 将其转换为01-01-2020 然后使用df.sort_values 对其进行排序并使用strftime 将其转换回Jan-2020 格式的另一种方法:

      df['Date'] = pd.to_datetime(df['Date'])
      df.sort_values(by=['Date'], inplace=True)
      df['Date'] = df['Date'].dt.strftime('%b-%Y')
      df
      
              Date  company  producttyp
      8   Jan-2020    proyu           5
      7   Jan-2020    proku          11
      9   Jan-2020    prose           2
      4   Feb-2020      pWC           4
      5   Feb-2020      pCA           4
      6   Feb-2020    prosu           3
      12  Mar-2020    proza           6
      11  Mar-2020    pride           7
      10  Mar-2020    proud          10
      0   Apr-2020    proA1          15
      3   Apr-2020   prouba          18
      2   Apr-2020   probCC          12
      1   Apr-2020    proB1           6
      13  May-2020  proVVaG          40
      14  May-2020    proAG          13
      15  May-2020     proG          41
      16  May-2020     PKWC          18
      

      【讨论】:

        【解决方案3】:

        假设您的 Date 列由实际的 datetime 对象组成,您可以简单地这样做:

        df.sort_values(by='Date')
        

        输出:

                  Date  company  producttyp
        8  2020-01-01    proyu           5
        7  2020-01-01    proku          11
        9  2020-01-01    prose           2
        4  2020-02-01      pWC           4
        5  2020-02-01      pCA           4
        6  2020-02-01    prosu           3
        12 2020-03-01    proza           6
        11 2020-03-01    pride           7
        10 2020-03-01    proud          10
        0  2020-04-01    proA1          15
        3  2020-04-01   prouba          18
        2  2020-04-01   probCC          12
        1  2020-04-01    proB1           6
        13 2020-05-01  proVVaG          40
        14 2020-05-01    proAG          13
        15 2020-05-01     proG          41
        16 2020-05-01     PKWC          18
        

        如果您不需要保留旧的、未排序的索引,您可以在之后调用reset_index(drop=True)

        如果您的 Date 列不是由 datetime 对象组成的,您可以使用以下方法进行转换:

        df.Date = pd.to_datetime(df.Date) 
        

        【讨论】:

        • 我知道这一点,它不在 datetime dtype 中
        • 那么你的问题标题用错了。无论哪种方式,我都编辑了我的答案并添加了转换。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多