熊猫分组日期和年份并总结金额

el3*_*323 5 python group-by pandas pandas-groupby

我有这样的熊猫数据框:

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
Run Code Online (Sandbox Code Playgroud)

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

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')]
Run Code Online (Sandbox Code Playgroud)

所以现在我有 3 个数据帧,数据帧中有 2010 年的date1日期,2011 年的date2日期和 2012 年的日期date3

让我们看看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
Run Code Online (Sandbox Code Playgroud)

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

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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

date1 = date1[['date','dollar_amount']].sort_values(by=['date'], 
ascending=True)
Run Code Online (Sandbox Code Playgroud)

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

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

jez*_*ael 5

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

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
Run Code Online (Sandbox Code Playgroud)

如果想创建dictionary of DataFrame

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
Run Code Online (Sandbox Code Playgroud)