【问题标题】:Pandas groupby sum by one column and order results by anotherPandas groupby 按一列求和,按另一列排序结果
【发布时间】:2019-03-23 01:53:32
【问题描述】:

我希望让我的数据框(请参阅数据框 1)按商品分组并汇总销售量,并按最旧的销售日期排序(即,请参阅数据框 2)

到目前为止,我的代码如下:

cusips_df = cusips_df.sort_values(by='settle_date', ascending=True)

cusips_df = cusips_df.groupby(['cusip'], as_index=False).agg({"principal":sum})

但这会产生以下数据框(看起来它是按项目排序的,按字母顺序,而不是按最旧的销售日期)

【问题讨论】:

  • 在你的 groupby() 中添加sort=Falsecusips_df = cusips_df.groupby(['cusip'], as_index=False, sort=False).agg({"principal":sum})

标签: python pandas dataframe


【解决方案1】:

试试这个

cusips_df['settle_date'] = pd.to_datetime(cusips_df['settle_date'], format='%d/%m/%Y')
cusips_df = cusips_df.groupby(['cusip'], as_index=False).agg({'principal':sum, 'settle_date': min}).sort_values('settle_date', ascending=True)[['cusip', 'principal']]

【讨论】:

    【解决方案2】:

    您还可以在进行分组时聚合日期的最小值,然后按该最小日期对组进行排序(如果需要,可以从结果中删除日期列):

    import numpy as np
    import pandas as pd
    
    d = { "Item" : ["Apple", "Apple", "Pear", "Pear", "Orange", "Orange"],
          "Amount": [1000, 2000, 30, 40, 400, 50],
          "DateSold": ["2018-02-01", "2018-06-01", "2018-01-01", "2018-02-20", "2018-04-15", "2018-04-30"]}
    df = pd.DataFrame(data=d)
    grouped_df = df.groupby(['Item'], as_index=False).agg({"Amount":np.sum, "DateSold":np.min})
    grouped_and_sorted_df = grouped_df.sort_values('DateSold', ascending=True)[["Item","Amount"]]
    

    在此示例中,df 将是:

         Item  Amount    DateSold
    0   Apple    1000  2018-02-01
    1   Apple    2000  2018-06-01
    2    Pear      30  2018-01-01
    3    Pear      40  2018-02-20
    4  Orange     400  2018-04-15
    5  Orange      50  2018-04-30
    

    grouped_and_sorted_df 将是:

         Item  Amount
    2    Pear      70
    0   Apple    3000
    1  Orange     450
    

    【讨论】:

      猜你喜欢
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 2020-12-14
      • 2019-10-17
      • 1970-01-01
      • 2018-03-29
      • 2014-03-17
      相关资源
      最近更新 更多