【问题标题】:pandas groupby dates and years and sum up amountspandas groupby 日期和年份并汇总金额
【发布时间】:2018-06-24 00:20:49
【问题描述】:

我有这样的熊猫数据框:

d = {'dollar_amount': ['200.25', '350.00', '120.00', '400.50', '1231.25', '700.00', '350.00', '200.25', '2340.00'], 'date': ['22-01-2010','22-01-2010','23-01-2010','15-02-2010','27-02-2010','07-03-2010','14-01-2011','09-10-2011','28-07-2012']}
df = pd.DataFrame(data=d)

df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y')
pd.options.display.float_format = '{:,.4f}'.format
df['dollar_amount'] = df['dollar_amount'].astype(float)
df

    date        dollar_amount
0   22-01-2010  200.25
1   22-01-2010  350.00
2   23-01-2010  120.00
3   15-02-2010  400.50
4   27-02-2010  1231.25
5   07-03-2010  700.00
6   14-01-2011  350.00
7   09-10-2011  200.25
8   11-11-2011  2340.00
9   12-12-2011  144.50
10  12-09-2012  760.00
11  22-10-2012  255.00
12  28-07-2012  650.00

我想汇总每年每一天的金额。 所以我是这样划分年份的:

date1 = df[(df['date'] >= '2010-01-01') & (df['date'] < '2011-01-01')]
date2 = df[(df['date'] >= '2011-01-01') & (df['date'] < '2012-01-01')]
date3 = df[(df['date'] >= '2012-01-01') & (df['date'] < '2013-01-01')]

所以现在我在 date1 数据框中有 3 个数据框,日期从 2010 年开始, date2 中的日期为 2011 年,date3 中的日期为 2012 年。

让我们看看date1

print type(date1)
date1

<class 'pandas.core.frame.DataFrame'>

    date        dollar_amount
0   2010-01-22  200.2500
1   2010-01-22  350.0000
2   2010-01-23  120.0000
3   2010-02-15  400.5000
4   2010-02-27  1,231.2500
5   2010-03-07  700.0000

接下来我将按日期汇总金额,因此我将使用以下方法对日期进行分组:

date1 = date1.groupby('date', as_index=False).sum()
date1 = date1[['date','dollar_amount']].sort_values(by=['date'], 
ascending=True)

date2 = date2.groupby('date', as_index=False).sum()
date2 = date2[['date','dollar_amount']].sort_values(by=['date'], 
ascending=True)

date3 = date3.groupby('date', as_index=False).sum()
date3 = date3[['date','dollar_amount']].sort_values(by=['date'], 
ascending=True)

现在让我们看看日期帧date1

date1

date        dollar_amount
0   2010-01-22  550.2500
1   2010-01-23  120.0000
2   2010-02-15  400.5000
3   2010-02-27  1,231.2500
4   2010-03-07  700.0000

这只是按日期升序对它们进行排序:

date1 = date1[['date','dollar_amount']].sort_values(by=['date'], 
ascending=True)

现在我在不同的数据框中得到了每年的 DollarAmounts 日期总和。然后我正在绘制每年的痕迹。它工作正常并完成任务。但是这段代码非常多余,我正在复制相同的代码,如果我说的是 2000 年到 2017 年的数据,那么我将不得不复制并粘贴同一段代码 18 次。我认为这样做不是很有效。

我确信一定有更好的方法来做到这一点,但我不知道怎么做。请帮助我。谢谢。

【问题讨论】:

    标签: python pandas group-by pandas-groupby


    【解决方案1】:

    我认为你可以通过years 创建MultiIndex 来输出:

    df1 = df.groupby('date', as_index=False)['dollar_amount'].sum()
    df1 = df1.set_index(df['date'].rename('year').dt.year, append=True).swaplevel(0,1)
    print (df1)
                 date  dollar_amount
    year                            
    2010 0 2010-01-22       550.2500
         1 2010-01-23       120.0000
         2 2010-02-15       400.5000
         3 2010-02-27     1,231.2500
         4 2010-03-07       700.0000
    2011 5 2011-01-14       350.0000
         6 2011-10-09       200.2500
    2012 7 2012-07-28     2,340.0000
    
    print (df1.loc[2010])
            date  dollar_amount
    0 2010-01-22       550.2500
    1 2010-01-23       120.0000
    2 2010-02-15       400.5000
    3 2010-02-27     1,231.2500
    4 2010-03-07       700.0000
    
    print (df1.loc[2011])
            date  dollar_amount
    5 2011-01-14       350.0000
    6 2011-10-09       200.2500
    
    print (df1.loc[2012])
            date  dollar_amount
    7 2012-07-28     2,340.0000
    

    如果要创建dictionary of DataFrames:

    d = dict(tuple(df.groupby(df['date'].dt.year)))
    print (d)
    
    print (d[2010])
            date  dollar_amount
    0 2010-01-22       550.2500
    1 2010-01-23       120.0000
    2 2010-02-15       400.5000
    3 2010-02-27     1,231.2500
    4 2010-03-07       700.0000
    
    print (d[2011])
            date  dollar_amount
    5 2011-01-14       350.0000
    6 2011-10-09       200.2500
    
    print (d[2012])
            date  dollar_amount
    7 2012-07-28     2,340.0000
    

    【讨论】:

    • 但它总结了多年。我想总结日期,然后将结果数据框划分为多年
    • 是否需要每年创建数据框?
    • 我想我没有正确解释我的问题。让我做一些修改。
    • 好的,所以预期的输出是 3 个 DataFrame?还是情节?
    • 没有预期的结果。代码工作正常。但我想减少代码的冗余。我通过创建 3 个数据框重复同一行代码。我正在寻找的是一种有效地完成相同任务的方法。希望我解释正确。
    【解决方案2】:

    您可以使用resample

    import pandas as pd
    d = {'dollar_amount': ['200.25', '350.00', '120.00', '400.50', '1231.25', '700.00', '350.00', '200.25', '2340.00'], 'date': ['22-01-2010','22-01-2010','23-01-2010','15-02-2010','27-02-2010','07-03-2010','14-01-2011','09-10-2011','28-07-2012']}
    df = pd.DataFrame(data=d)
    # convert dates to datetime
    df['date'] = pd.to_datetime(df['date'])
    # convert amounts to floats
    df['dollar_amount'] = pd.to_numeric(df['dollar_amount'])
    # set date as the index and drop the date column
    df.index = df.date
    df = df.drop('date', axis=1)
    # resample the dataframe every 1 day (D) and sum ovr each day
    df = df.resample('D').sum()
    # eliminate the rows where the sum is 0 (i.e. rows which were not in the original dataframe)
    df = df[~(df['dollar_amount'].isnull())]
    

    输出:

                dollar_amount
    date                     
    2010-01-22         550.25
    2010-01-23         120.00
    2010-02-15         400.50
    2010-02-27        1231.25
    2010-07-03         700.00
    2011-01-14         350.00
    2011-09-10         200.25
    2012-07-28        2340.00
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 2017-08-01
      • 1970-01-01
      • 2020-03-13
      • 2021-11-16
      • 2019-07-22
      • 2019-03-05
      • 1970-01-01
      相关资源
      最近更新 更多