【问题标题】:Pandas stacked bar chart issue熊猫堆积条形图问题
【发布时间】:2019-04-17 14:26:42
【问题描述】:

我有一个数据框 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()

【问题讨论】:

  • 好吧,您当然不需要将 DataFrame 转换为列表进行绘图。你能准确解释一下你在策划什么吗?您可能只需要在绘图之前操作 DataFrame 即可获得所需的内容。
  • 感谢您的评论 - 有关绘图的详细信息,请参阅编辑。

标签: python pandas matplotlib pandas-groupby


【解决方案1】:

我认为小、中、大发票的分类方式存在问题。分类需要在数据框中完成,并考虑为每种发票类型分配标签。

这里是分类步骤:

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)

【讨论】:

  • 感谢一个很好的答案!但是,这不会进行年/月分组,只是绘制每个日期的总和。
  • 这很琐碎,现在已经添加了:)
  • @JeevanKumar,非常好的一个 +1。
猜你喜欢
  • 2019-08-03
  • 2019-04-30
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多