【问题标题】:How does using python Pandas unstack in plt?如何在 plt 中使用 python Pandas unstack?
【发布时间】:2018-11-19 08:07:38
【问题描述】:

我参考了网上的资料。

我想绘制我的数据。

        id        time           w
5630    39  2018-03-01  841.704067
5631    39  2018-03-02  605.119444
5632    39  2018-03-03  651.337735
5633    39  2018-03-04  595.974252
5634    39  2018-03-05  656.031315
5635    39  2018-03-06  972.101045
5636    39  2018-03-07  660.659986
5637    39  2018-03-08  1225.648122
        .
        .
5685    39  2018-04-25  699.347653
5686    39  2018-04-26  516.267288
5687    39  2018-04-27  621.807574
5688    39  2018-04-28  488.903030
5689    39  2018-04-29  790.637525
5690    39  2018-04-30  457.569811
5691    40  2018-03-01  157.636364
5692    40  2018-03-02  138.759563
5693    40  2018-03-03  209.213996
5694    40  2018-03-04  177.255571
5695    40  2018-03-05  155.696106
        .
        .
5748    40  2018-04-27  133.512968
5749    40  2018-04-28  157.630623
5750    40  2018-04-29  210.996613
5751    40  2018-04-30  120.643963

My reference URL

我执行这个:

fig, ax = plt.subplots(figsize=(15,7))
df2.groupby(['time','id']).count()['w'].unstack().plot(ax=ax)

但我的结果很奇怪。

我想这样画:

我刚刚剪下了我的样本,但我想一次全部画出来。重叠或单独。

如何在下面获得类似的结果。

我真的需要你的帮助。非常感谢。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    一切正常,但您的数据样本的计数为 1,因为 groupby 按列 timeid 以及 ech 对获取组的大小 1

    print (df2.groupby(['time','id']).count()['w'])
    time                 id
    2017-04-03 18:09:04  39    1
    2017-04-03 18:16:04  39    1
    2017-04-03 18:23:04  39    1
    2017-04-03 18:30:04  39    1
    2017-04-03 18:37:04  39    1
    2017-04-03 18:44:04  40    1
    2017-04-03 18:51:04  40    1
    2017-04-03 18:58:04  40    1
    2017-04-03 19:05:04  40    1
    2017-04-03 19:12:04  40    1
    Name: w, dtype: int64
    

    然后重构输出为DataFrame,其中两列由1NaNs 填充,用于不成对存在的值:

    df = df2.groupby(['time','id']).count()['w'].unstack()
    print (df)
    id                    39   40
    time                         
    2017-04-03 18:09:04  1.0  NaN
    2017-04-03 18:16:04  1.0  NaN
    2017-04-03 18:23:04  1.0  NaN
    2017-04-03 18:30:04  1.0  NaN
    2017-04-03 18:37:04  1.0  NaN
    2017-04-03 18:44:04  NaN  1.0
    2017-04-03 18:51:04  NaN  1.0
    2017-04-03 18:58:04  NaN  1.0
    2017-04-03 19:05:04  NaN  1.0
    2017-04-03 19:12:04  NaN  1.0
    

    如果值仅是日期,则需要Grouper by 7dMS 用于月初而不是time 列(还添加参数fill_value=0 用于将NaNs 替换为0 ):

    df = df2.groupby([pd.Grouper(freq='7d', key='time'),'id'])['w'].count().unstack(fill_value=0)
    print (df)
    buildingid  39  40
    reporttime        
    2018-03-01   7   5
    2018-03-08   1   0
    2018-04-19   1   0
    2018-04-26   5   4
    

    所以最后你的代码看起来像:

    fig, ax = plt.subplots(figsize=(15,7))
    df2.groupby([pd.Grouper(freq='7d', key='time'),'id'])['w'].count().unstack(fill_value=0).plot(ax=ax)
    

    【讨论】:

    • @@jezrael,能否建议我如何在参考站点上实现类似功能?我创建了一个类似参考站点的示例并执行了它,得到了相同的结果。
    • 我想是的,给我一些时间。
    • @Linminxiang - 我没有看到你的真实数据,所以我的解决方案建议每天计数值。但如果数据只显示一天,则它不会绘制任何内容,然后需要将 freq=d 更改为 freq=1h 或类似的。
    • @@jezrael,我已经更新了我的数据。我的数据是这样的。对了,刚才提到的代码不能画东西。你能帮帮我吗?
    • @Linminxiang - 是的,我认为需要this,只需将grouped = df.groupby('a') rowlength = grouped.ngroups/2 更改为grouped = df2.groupby('id') rowlength = grouped.ngroups//2
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 2018-09-24
    • 1970-01-01
    • 2021-01-11
    • 2013-10-25
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    相关资源
    最近更新 更多