【问题标题】:Stacked bar plotting dataframe groups堆积条形图数据框组
【发布时间】:2019-12-28 17:08:06
【问题描述】:

我正在尝试从数据框中绘制堆积条形图几个小时。如果这是一个简单的问题,我很抱歉,但我无法让它工作,我需要帮助。

我的数据框如下所示:

                                 _id        date                              news_source
0   2715eeada6726024df20e6938ef09f64  2019-12-23                    airport-suppliers.com
1   d068a3d0b24d2a348ff8c8a856aba86c  2019-12-23                    airport-suppliers.com
17  552d7bb9f7d3fd689dd308dc7650baac  2019-12-23                    airport-suppliers.com
20  82be33a041204fd008ba5093607310f6  2019-12-23                    airport-suppliers.com
21  4044907f5b6d5610ec59a03c75e0554c  2019-12-23  airportsinternational.keypublishing.com
22  db4e1e4d1246abc3304e5d77688424dc  2019-12-23  airportsinternational.keypublishing.com
23  b7f57b63218190d249d19624bbdcb520  2019-12-23           internationalairportreview.com
27  84d5377bd8755a685100e408140c4ab1  2019-12-23           internationalairportreview.com
28  8289a1c1b3fa3f618c332d61023eae00  2019-12-16               passengerterminaltoday.com
29  f4f020f09ee5f95499a26c43cfd82d2d  2019-12-16  airportsinternational.keypublishing.com
..                               ...         ...                                      ...
59  a18388a1c77889bdbe6aaa9238a8d21a  2019-12-16                    airport-suppliers.com
62  5cd894a9fa587ab4267adfd23f01e1c4  2019-12-16  airportsinternational.keypublishing.com
66  bb7d05d61f999b1f0b317d21c6c23c0c  2019-12-16  airportsinternational.keypublishing.com
70  f49b9ce330198aec666cb90275d293b2  2019-12-16           internationalairportreview.com
71  af893db09fad9335413ce5c325ced712  2019-12-16               passengerterminaltoday.com
72  e21dc60cfda457b03a6dba6ab44aa3b1  2019-12-16               passengerterminaltoday.com
81  963760af4b4653d175902f4d6285ff0a  2019-12-16               passengerterminaltoday.com
82  778b572be28fd25f394cfa41bbc5aa4a  2019-12-16                    airport-suppliers.com

我想展示的最后一个情节就像this,但不是策略,而是每周日期,news_source 而不是产品,计数是一样的。

我尝试的是通过date 和news_source 分组,然后计算它们。然后我剩下的工作就搞砸了,最后我无法像this 中的示例那样获得格式。此外,唯一 news_source 的数量、日期可能会随时间而变化,因此我会尽可能避免硬编码。

分组:

groups = df.groupby(['date', 'news_source'])["_id"].count()

如果您需要它们作为字典:

counts = defaultdict(dict)
for index, count in zip(groups.index, groups):
    try:
        counts[index[0]][index[1]] += count
    except KeyError:
        counts[index[0]][index[1]] = count

输出是:

{'2019-12-16': {'airport-suppliers.com': 9,
                'airportsinternational.keypublishing.com': 12,
                'internationalairportreview.com': 19,
                'passengerterminaltoday.com': 21},
 '2019-12-23': {'airport-suppliers.com': 21,
                'airportsinternational.keypublishing.com': 2,
                'internationalairportreview.com': 5}}

如果您知道如何正确操作,我们将不胜感激,谢谢。

这是生成最小可重现示例的代码:

import pandas as pd

dates = ['2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-23', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16', '2019-12-16']

sources = ['airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'passengerterminaltoday.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'airport-suppliers.com', 'passengerterminaltoday.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'airport-suppliers.com', 'passengerterminaltoday.com', 'airport-suppliers.com', 'airport-suppliers.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airport-suppliers.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'airportsinternational.keypublishing.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'passengerterminaltoday.com', 'airport-suppliers.com', 'airport-suppliers.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com', 'internationalairportreview.com']

df = pd.DataFrame({"date": dates, "news_source": sources})  

【问题讨论】:

  • 您的可重现示例不包括 _id 列。
  • 这个任务真的没有必要。

标签: python pandas matplotlib


【解决方案1】:

这个怎么样?我为您的数据添加了计数:

df1 = df.groupby(['date', 'news_source']).size().reset_index().rename(columns={0:'count'})

然后,我使用pd.crosstab,设置以下索引、列和值参数。然后包含一个 aggfunc,在本例中为 sum()。

pd.crosstab(index=df1['date'], columns=df1['news_source'], values=df1['count'], aggfunc=sum).plot.bar(stacked=True)

结果:

【讨论】:

  • 非常感谢,我会尽快尝试并提供反馈。
  • @emremrah 没有问题!我没有绘制很多东西,但是尝试一下会很有趣。我认为输出是ax,所以如果你愿意,你可以将它集成到matplotlib中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2020-11-10
相关资源
最近更新 更多