我试图按天获取数据集中每个类别的比例,以便最终能够绘制它。
示例(daily_usage):
type date count
0 A 2016-03-01 70
1 A 2016-03-02 64
2 A 2016-03-03 38
3 A 2016-03-04 82
4 A 2016-03-05 37
...
412 G 2016-03-27 149
413 G 2016-03-28 382
414 G 2016-03-29 232
415 G 2016-03-30 312
416 G 2016-03-31 412
我按类型绘制了平均值和中位数,并使用以下代码:
daily_usage.groupby('type')['count'].agg(['median','mean']).plot(kind='bar')
但我想要一个与日常计数的比例相似的情节。但是,为了最终绘制它,我不需要显示日期。它只是显示每种类型的平均/中位数每日比例。
比例解释我的意思是,例如,第一行:A型在3月1日发生了70次;考虑到3月1日的所有其他事件,总共有948个事件。 3月1日A型比例为70/948。这将针对所有行计算。最终的绘图必须显示x轴上的每种类型,以及y轴上的平均每日比例
我尝试以两种方式获得比例。
第一个:
daily_usage['ratio'] = (daily_usage / daily_usage.groupby('date').transform(sum))['count']
第一次尝试的分母为我提供了这个示例输出,所以看起来应该很容易将原始计数列除以这个新的每日计数列:
count
0 ... 948
1 ... 910
2 ... 588
3 ... 786
4 ... 530
5 ... 1043
错误:
TypeError: unsupported operand type(s) for /: 'str' and 'str'
第二个:
daily_usage.div(day_total,axis='count')
其中day_total = daily_usage.groupby('date').agg({'count':'sum'}).reset_index()
错误:
TypeError: ufunc true_divide cannot use operands with types dtype('<M8[ns]') and dtype('<M8[ns]')
有什么更好的方法可以做到这一点?
答案 0 :(得分:1)
如果您只想在数据框中添加新列,则可以执行以下操作:
df['ratio'] = (df.groupby(['type','date'])['count'].transform(sum) / df.groupby('date')['count'].transform(sum))
然而,现在差不多20分钟,我正在试图找出你想要绘制的内容,因为我仍然没有真正得到你的意图我要求你留下一个详细评论如果您需要帮助绘图并准确绘制您想要绘制的内容以及如何绘制(每天使用每天或其他形式的一个图表)。
PS:
我的代码df
中的指的是您的daily_usage
数据框。
希望这有用。