大Pandas的月和任意属性求和

2024-04-24 16:25:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在进入数据分析,并正在建立一个小会计应用程序,以跟踪我的开支。在

我的目标是在Django应用程序中跟踪我的开销,用Pandas对其进行分析,并用Matplotlib将其可视化。在

我的数据基础来自如下Django ORM查询:

qs = MyExpenses.objects.values('date', 'amount', 'category')

然后我使用Pandas的from_records方法创建索引数据帧:

^{pr2}$

使用df.head()检查数据帧的内容:

            amount  category
date        
2017-12-29  14.90   Food
2017-12-27  2.98    Household
2017-12-27  9.72    Food
2017-12-24  2.00    Food
2017-12-23  1.49    Household

目前看起来不错。在

在这一点上,我不知道如何正确地进行。我想每月按类别汇总我的开支。

此groupby操作:

summed_df = df.groupby([pd.Grouper(freq='1M'), 'category']).sum()

返回正确聚合的数据:

                                amount
date        category    
2016-02-29  Cosmetics           2.45
            Food                376.41
            Household           43.82
            Leisure             630.13
2016-03-31  Food                345.41
            Household           14.76
            Leisure             553.35
...

但是调用summed_df.plot()会呈现出这样的情节: enter image description here

显然Panda使用日期和类别的组合索引作为x轴,而amount列作为单个数据系列。如上所述,这不是我想要的。在

因此,我不得不用另一种方法进行求和,或者以某种方式从索引中删除category并使其再次成为常规列,但我不知道如何处理这个问题。在

外面的熊猫裂缝能帮我吗?在


Tags: 数据django方法应用程序pandasdfdatefood
1条回答
网友
1楼 · 发布于 2024-04-24 16:25:44

考虑旋转groupby结果,其中每个类别成为各自的列,成为单独的行。下面用随机数据进行了演示(为再现性设定种子):

数据

import numpy as np
import pandas as pd
import datetime as dt
import time    
import matplotlib.pyplot as plt

epoch_time = int(time.time())

np.random.seed(55)
df = pd.DataFrame({'date': [dt.datetime.fromtimestamp(np.random.randint(1450000000, epoch_time)) 
                                for _ in range(500)],
                   'category': ["".join(np.random.choice(['Cosmetics', 'Food', 'Household', 'Leisure'],1)) 
                                 for _ in range(500)],
                   'amount': abs(np.random.randn(500))*100}).set_index('date')

print(df.head(10))
#                          amount   category
# date                                      
# 2016-12-23 10:30:18   10.711083  Household
# 2016-05-05 15:40:07  176.670986  Cosmetics
# 2017-04-24 17:55:04   16.700308  Cosmetics
# 2018-01-02 06:41:33  242.877311       Food
# 2017-12-15 00:06:29   95.990759  Household
# 2016-07-30 18:22:13   45.610068       Food
# 2016-07-13 16:00:11   60.704399    Leisure
# 2017-04-15 20:28:03   12.410939       Food
# 2017-12-07 19:33:18   61.599076  Cosmetics
# 2017-10-29 20:20:07  117.341928    Leisure

分组并绘制

^{pr2}$

Plot Output

相关问题 更多 >