如何汇总和绘制熊猫数据框中的数据?

时间:2018-05-30 19:44:27

标签: python pandas dataframe matplotlib plot

我有这个数据框

df[['payout_date','total_value']].head(10)

    payout_date         total_value
0   2017-02-14T11:00:06  177.313
1   2017-02-14T11:00:06  0.000
2   2017-02-01T00:00:00  0.000
3   2017-02-14T11:00:06  47.392
4   2017-02-14T11:00:06  16.254
5   2017-02-14T11:00:06  125.818
6   2017-02-14T11:00:06  0.000
7   2017-02-14T11:00:06  0.000
8   2017-02-14T11:00:06  0.000
9   2017-02-14T11:00:06  0.000

我正在使用此代码在特定日期范围内按天(和按月)绘制total_value的汇总总和,但是它会为每个total_value绘制一个条形,而不是总和 - 每天汇总total_value

(df.set_index('payout_date')
                    .loc['2018-02-01':'2018-02-02']
                    .groupby('payout_date')
                    .agg(['sum'])
                    .reset_index()
                    .plot(x='payout_date', y='total_value',kind="bar"))
plt.show()

数据未汇总,我从df得到每个值的条形码:

enter image description here

如何按日期和按月汇总total_value

我尝试使用this的答案并结合其他类似的问题,但没有一个适用于此处使用的日期格式。

我也尝试在代码中添加.dt.to_period('M'),但我收到TypeError: Empty 'DataFrame': no numeric data to plot错误。

2 个答案:

答案 0 :(得分:1)

<强> 设置

df = pd.DataFrame({'payout_date': {0: '2017-02-01T11:00:06',   1: '2017-02-01T11:00:06',   2: '2017-02-02T00:00:00',   3: '2017-02-14T11:00:06',   4: '2017-02-14T11:00:06',   5: '2017-02-15T11:00:06',   6: '2017-02-15T11:00:06',   7: '2017-02-16T11:00:06',   8: '2017-02-16T11:00:06',   9: '2017-02-16T11:00:06'},  'total_value':{0: 177.313,   1: 22.0,   2: 25.0,   3: 47.391999999999996,   4: 16.254,   5: 125.818,   6: 85.0,   7: 42.0,8: 22.0,   9: 19.0}})

使用 normalize 按天分组:

df.groupby(pd.DatetimeIndex(df.payout_date).normalize()).sum().reset_index()

  payout_date  total_value
0  2017-02-01      199.313
1  2017-02-02       48.000
2  2017-02-14       63.646
3  2017-02-15      210.818
4  2017-02-16       83.000

将上一个命令扩展为plot:

df.groupby(
    pd.DatetimeIndex(df.payout_date)      \
    .normalize().strftime('%Y-%m-%d'))    \
    .agg(['sum'])                         \
    .reset_index()                        \
    .plot(x='index', y='total_value', kind='bar')

plt.tight_layout()
plt.show()

我的样本数据的输出:

enter image description here

如果要在子集上应用此功能,可以执行以下操作:

tmp = df.loc[(df.payout_date > '2017-02-01') & (df.payout_date < '2017-02-15')]

tmp.groupby(
    pd.DatetimeIndex(tmp.payout_date)                     \
    .normalize().strftime('%Y-%m-%d'))['total_value']     \
    .agg(['sum'])

# Result
                sum
2017-02-01  199.313
2017-02-02   25.000
2017-02-14   63.646

只会将您想要的范围加起来。

答案 1 :(得分:0)

尝试这种方式:

df = df.iloc[1:7]
(df.set_index('payout_date')
                .groupby('payout_date')
                .agg(['sum'])
                .reset_index()
                .plot(x='payout_date', y='total_value',kind="bar"))
plt.show()

之前选择索引的位置