首页 > 解决方案 > 在 Pandas 中随着时间的推移绘制带有另一列标签的列

问题描述

所以我在 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 个不同的图表上。

标签: pythonpandas

解决方案


你有几个选择。如果你真的想要一个你想要的单线解决方案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)})

海博恩

您用于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)

熊猫.pivot

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

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

输出*

方法之间的轴和标签略有不同。这是 groupby 输出。 在此处输入图像描述


推荐阅读