Python 如何从pandas dataframe聚合和绘制数据?
我有这个数据框Python 如何从pandas dataframe聚合和绘制数据?,python,pandas,dataframe,matplotlib,plot,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
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
我使用这段代码按天和按月绘制特定日期范围内的合计值,但它为每个合计值绘制一个条形图,而不是按天合计合计合计值
数据未聚合,我从df获得每个值的条形图:
如何按日期和月份合计总价值
我试着使用其他类似问题的答案,但没有一个适合这里使用的日期格式
我还尝试将.dt.to_period'M'添加到代码中,但我得到了TypeError:Empty'DataFrame':没有要打印的数字数据错误 设置
使用“正常化”仅按天分组:
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
扩展上一个命令以打印:
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()
我的示例数据的输出:
如果要将此应用于子集,可以执行以下操作:
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
这将只对您所需的范围求和。请尝试以下方法:
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()
如果在之前选择了索引如果删除.loc['2018-02-01':'2018-02-02'],会发生什么?@Joe我尝试过,它计算了非常长的时间>30分钟,我停止了脚本,因为数据帧非常大,所以我必须选择一个特定的间隔。由于行数很少,它可以正确绘制聚合,而不使用loc Try,如果它有效,在输入代码之前进行选择posted@Joe我做了new_df=df。设置了_索引'payout_date'。loc['2018-02-01':'2018-02-02'],然后尝试使用没有.loc的初始代码,但我得到了'keyrerror:'payout_date error',所以在新的_df中没有'payout_date'列?为什么?如何在原始代码之前正确地进行选择?谢谢,我得到了一个很奇怪的结果。“之前选择索引”是什么意思?如何选择索引?还有,df.iloc[1:7]代表什么?它的用途是什么?@user40,df=df.iloc[1:7]您选择行。在本例中,从第1行到第7行。例如,如果希望前1000行更改为df.iloc[0:1000]
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
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()