python - 熊猫堆积条形图问题
问题描述
我有一个dft
包含两列的数据框'DATE'
,'INVOICE'
看起来如下所示,但跨越多年的行数要多得多。
DATE INVOICE
0 2015-01-29 68.61
1 2015-01-15 16.54
2 2015-01-15 4.72
3 2015-01-14 109.71
我首先按INVOICE
大小对这些数据进行排序,以给出三个单独的数据框。
small = dft[(dft['INVOICE'] < 25) &
(dft['INVOICE'] > 0)]
medium = dft[(dft['INVOICE'] <= 60) &
(dft['INVOICE'] >= 25)]
large = dft[(dft['INVOICE'] > 60)]
然后,我总结了每个月每个类别的总发票支出,并将其转换为一个列表:
periods = dft.DATE.dt.to_period("M")
small1 = small.groupby(periods).sum().reset_index()
medium1 = medium.groupby(periods).sum().reset_index()
large1 = large.groupby(periods).sum().reset_index()
# Convert Dataframes to lists for plotting
x1 = small1['DATE'].tolist()
x2 = medium1['DATE'].tolist()
x3 = large1['DATE'].tolist()
y1 = small1['INVOICE'].tolist()
y2 = medium1['INVOICE'].tolist()
y3 = large1['INVOICE'].tolist()
最后绘制月份和年份的堆积条形图,例如(2015-01)与该月的累积发票大小。我的问题是这个条形图给出了一个错误,因为 y 列表的大小不同。
indexes = np.arange(len(x1))
p3 = plt.bar(indexes, y1 + y2 + y3)
p2 = plt.bar(indexes, y2 + y1)
p1 = plt.bar(indexes, y1)
plt.show()
解决方案
我认为小、中、大发票的分类方式存在问题。分类需要在数据框中完成,并考虑为每种发票类型分配标签。
这是分类步骤:
def invoice_classifier(amount):
if amount < 25 and amount > 0: return 'small'
elif amount <= 60: return 'medium'
elif amount > 60: return 'large'
# for each row assign a class
df['invoice_class'] = df.apply(lambda r: invoice_classifier(r['INVOICE']), axis=1)
# plotting
df.groupby(by=['DATE', 'invoice_class'])['INVOICE'].sum().unstack('invoice_class').plot(kind='bar', stacked=True)
这应该是您正在寻找的。
编辑:用户也想要月份分组。
df['month_dates'] = df['dates'].dt.to_period('M')
df.groupby(by=['month_dates', 'invoice_class'])['INVOICE'].sum().unstack('invoice_class').plot(kind='bar', stacked=True)
推荐阅读
- r - R 预测()指定 h
- javascript - 递归检查 dir 是否包含文件并提前退出
- python - 将保存在文本文件中的数组插入 Python numpy 数组
- sql - 替代加入命令
- java - 如何读取文件 xsb XML Schema Binary File
- ionic-framework - 如何在 ionic 中创建自定义模式?
- excel - Excel 中的条件总和,将高于 X 的值计为 X
- python - 在插入 LSTM 之前处理 Keras 输入的每个时间步长
- java - Lucene 8.5 中的自定义分析器
- syslog-ng - 如何在 syslog 中为出站连接指定特定接口