【问题标题】:Plot a column with labels of another column over time in Pandas在 Pandas 中随着时间的推移绘制带有另一列标签的列
【发布时间】:2020-03-23 17:13:44
【问题描述】:

所以我在 Pandas 数据框 (python) 中有一个表,我想在其中绘制一个列,其中包含来自另一列的标签在时间列上。

例如:

fruit | fruit_count | datestamp 
apple    20           03-2018
kiwi     10           03-2018
mango    35           03-2018
apple    16           04-2018
kiwi     18           04-2018
mango    40           04-2018
.        .              .
.        .              .
apple    50           03-2020
kiwi     70           03-2020
mango    120          03-2020

基本上,这将是一个图,其中 x 轴是日期戳(03-2018、04-2018、...、03-2020),并且将有 3 个线图 - 一个用于苹果、猕猴桃和芒果有3个对应的标签。

目前,我尝试通过从数据框中解析唯一的水果名称来做到这一点

fruits = list(set(fruit_df['fruit'].tolist())) 然后我循环遍历并绘制每一个

for fruit in fruits:
    fruit_df[fruit_df['fruit'] == fruit].plot(x='datestamp', y='fruit_count')

有没有更好的方法来做到这一点,它可以在一行中完成所有这些,并将所有内容都绘制在一个图表上,而不是 3 个不同的图表上。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您有几个选择。如果你真的想要一个单行解决方案,你会想要seaborn,或者使用pivot重塑你的数据

    样本数据

    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    N = 20
    df = pd.DataFrame({'fruit': ['apple', 'kiwi', 'mango']*N,
                       'date_stamp': np.repeat(pd.date_range('2010-01-01', freq='1M',  periods=N), 3),
                       'fruit_count': np.random.randint(1,100, N*3)})
    

    Seaborn

    您使用hue 指定组。

    sns.lineplot(data=df, hue='fruit', x='date_stamp', y='fruit_count')
    

    pandas.DataFrame.groupby

    与您当前的实现类似,但您可以使用groupby 拆分为子框架。

    fig, ax = plt.subplots()
    for fruit, gp in df.groupby('fruit'):
        gp.plot(x='date_stamp', y='fruit_count', ax=ax, label=fruit)
    

    pandas.pivot

    在绘图前先旋转,然后你只需要一个绘图调用

    df.pivot(index='date_stamp', columns='fruit', values='fruit_count').plot()
    

    输出*

    方法之间的轴和标签略有不同。这是 groupby 输出。

    【讨论】:

      【解决方案2】:

      如果datestampfruit的组合是non-unique

      fruit_df.groupby(['datestamp', 'fruit'])['fruit_count'].sum().unstack().plot(kind='bar')
      

      如果组合是unique,这也应该有效:

      df.pivot(index='datestamp', columns='fruit', values='fruit_count').plot(kind='bar')
      

      【讨论】:

        猜你喜欢
        • 2021-02-03
        • 1970-01-01
        • 2020-10-25
        • 1970-01-01
        • 1970-01-01
        • 2022-12-22
        • 2018-02-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多