通过熊猫获取计数和总和分组数据框

时间:2018-06-27 18:46:40

标签: python sql pandas numpy matplotlib

我有一个sql表,如下所示:

+----+------------+--------+------------+
| id | department | amount |    date    |
+----+------------+--------+------------+
| 1  | d1         |     20 | 2018-06-10 |
| 2  | d1         |     12 | 2018-06-10 |
| 2  | d1         |     10 | 2018-06-11 |
| 3  | d2         |     31 | 2018-06-10 |
| 4  | d2         |     42 | 2018-06-10 |
| 5  | d3         |     82 | 2018-06-11 |
| 6  | d3         |     11 | 2018-06-11 |
| 7  | d3         |     10 | 2018-06-14 |
+----+------------+--------+------------+

我使用Pandas的read_sql方法阅读它,

df = pd.read_sql("select * table my_table", ...)

我想绘制数据的时间序列,因为x轴是一个月的天,而y轴是部门的计数。所以,我想我必须按月的天将它们分组,例如

gdf = df.groupby(['department', pd.Grouper(key='date', freq='d')])['amount'].sum()

和gdf看起来像:

department   date      
d1           2018-06-10      32
             2018-06-11      10
d2           2018-06-10      73
d3           2018-06-11      93
             2018-06-14      10

但是,我不知道如何使用gdf。我想用seaborn或mathplotlib绘制它。

我还想绘制按月份和部门分组的金额总和。

注意:通常,我会编辑sql语句以包含分组数据,但就我而言,我不允许这样做。我必须使用熊猫来做到这一点。

2 个答案:

答案 0 :(得分:2)

对于每个唯一部门,将“金额”相加一天,然后将其绘制在同一图上。

首先,在基于分组的分组之前,from sqlalchemy import create_engine from pandas.io import sql engine =create_engine('postgresql+psycopg2cffi://...') sql.execute("""create view test as select name, regexp_replace(name, '\\s\\(([0-9]+)\\)$', '') as name2 from table""", engine) 必须为date类型。

datetime

,然后按如下所示绘制时间序列:

df['date'] = pd.to_datetime(df['date'])

enter image description here

答案 1 :(得分:1)

DEEPAK SURANA的答案对于制图是正确的。但是,应该说,如果您的df['date']列具有str类型的数据,则此操作将无效。我添加了用于在下面创建DF并将df['date']列转换为datetime类型的示例代码。

import pandas as pd
data = [(1, 'd1', 20, '2018-06-10'),
        (2, 'd1', 12, '2018-06-10'),
        (2, 'd1', 10, '2018-06-11'),
        (3, 'd2', 31, '2018-06-10'),
        (4, 'd2', 42, '2018-06-10'),
        (5, 'd3', 82, '2018-06-11'),
        (6, 'd3', 11, '2018-06-11'),
        (7, 'd3', 10, '2018-06-14')]
labels = ['id', 'department', 'amount', 'date']
df = pd.DataFrame.from_records(data, columns=labels)
df['date'] = pd.to_datetime(df['date'])

DEEPAK SURANA的图形代码:

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
fig, ax = plt.subplots(figsize=(10,6))

for d in df['department'].unique():
    gdf = df[df['department']==d].groupby(pd.Grouper(key='date', freq='d')).sum()
    ax.plot(gdf.index, gdf['amount'], label=d)

ax.get_xaxis().set_major_locator(mdates.DayLocator())
ax.get_xaxis().set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xticks(rotation=30)
fig.tight_layout()

plt.legend(bbox_to_anchor=(1, 0), loc="upper right", box_transform=fig.transFigure,
           ncol=4, columnspacing=0.5)
plt.show()