【问题标题】:Plotting categorical data counts over time随时间绘制分类数据计数
【发布时间】:2020-02-11 16:40:30
【问题描述】:

我有一个 DataFrame (df),其中有一列包含分类数据 (ETH),带有一个 DateTimeIndex,我想随时间绘制类别计数(他们'按天重新索引,理想情况下我希望按年份绘制它们)。

df = pd.DataFrame({
    'County': {
        0: 'Bexar',
        3: 'Nueces',
        4: 'Kerr',
        9: 'Harris',
        13: 'Hidalgo'},
    'Date': {
        0: '2012-10-28 00:00:00',
        3: '2012-04-16 00:00:00',
        4: '2013-09-04 00:00:00',
        9: '2013-01-22 00:00:00',
        13: '2013-09-26 00:00:00'},
    'ETH': {
        0: 'Red',
        3: 'Green',
        4: 'Red',
        9: 'Green',
        13: 'Red'}
})
df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
df['ETH'] = df['ETH'].astype('category')
df = df.set_index('Date')

但是,groupby 或 pivot 的组合并没有给我任何我想要的东西,即使我知道这应该相当简单。我似乎找不到执行此操作的标准方法 - 帮助?

【问题讨论】:

    标签: matplotlib pandas


    【解决方案1】:

    下面的代码将首先按类别“ETH”进行分组,然后遍历每个组。

    对于每个组,然后使用 lambda 函数按 DataTimeIndex 年份分组,并返回该年份的行数。然后它会绘制这些计数。

    绘制年份时,它会将其绘制为数字(而不是日期),这就是 x 轴看起来有点奇怪的原因,您可以将其转换回日期(比如每年的 1 月 1 日)它更漂亮。我使用plt.xlimplt.ylim 稍微调整了限制,使其更易于查看。

    import pandas as pd
    import matplotlib.pyplot as plt
    
    df = pd.DataFrame({
        'County': {
            0: 'Bexar',
            3: 'Nueces',
            4: 'Kerr',
            9: 'Harris',
            13: 'Hidalgo'},
        'Date': {
            0: '2012-10-28 00:00:00',
            3: '2012-04-16 00:00:00',
            4: '2013-09-04 00:00:00',
            9: '2013-01-22 00:00:00',
            13: '2013-09-26 00:00:00'},
        'ETH': {
            0: 'Red',
            3: 'Green',
            4: 'Red',
            9: 'Green',
            13: 'Red'}
    })
    df['Date'] = pd.to_datetime(df['Date'], dayfirst=True, infer_datetime_format = True)
    df['ETH'] = df['ETH'].astype('category')
    df = df.set_index('Date')
    
    grouped = df.groupby('ETH')
    
    for key, group in grouped:
        data = group.groupby(lambda x: x.year).count()
        data['ETH'].plot(label=key)
    
    plt.xlim(2011, 2014)
    plt.ylim(0,3)
    
    plt.legend()
    
    plt.show()
    

    是的,我意识到颜色与 ETH 变量不匹配,因此“绿色”绘制为蓝色,而“红色”绘制为绿色:P

    【讨论】:

    • 正是我想要的!
    猜你喜欢
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 2019-03-13
    • 2011-12-11
    • 1970-01-01
    • 2019-12-11
    • 2016-09-18
    • 1970-01-01
    相关资源
    最近更新 更多