如何在groupby值上使用jupyter notebook中的循环获得单独的折线图

时间:2018-06-13 14:03:31

标签: python matplotlib jupyter-notebook seaborn

我有这种格式的数据框。

brand-var1-var2(date)-var3
A - 100 - 20/12 - 300
A - 110 - 12/12 - 132
B - 24 - 24/12 - 543
C - 235 - 3/12- 534

我想在每个品牌的jupyter笔记本中打印单独的折线图

对于品牌A

x_axis = df.var2
y_axis = df.var1

然后是品牌B

x_axis = df.var2
y_axis = df.var1

然后是品牌C等等......

我尝试使用带matplotlib的Loop但是徒劳无功。

from pandas import *
import matplotlib.pyplot as plt
%matplotlib inline

ys = df['orders'], df['gmv']
x_ax = df['brand']

for y_ax in ys:
    ts = Series(y_ax,index=x_ax)
    ts.plot(kind='bar', figsize=(15,5))
    plt.show()

这显示错误 - ValueError: cannot reindex from a duplicate axis

由于

1 个答案:

答案 0 :(得分:0)

我不确定你想要什么类型的情节。在问题的开头,您要求一个线图,但在代码中您调用kind='bar'。由于数据框看起来像是包含时间序列数据,因此我假设您需要一个折线图。

我使用以下内容创建了一个随机数据框:

# Import packages
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import datetime
import random

# Random date function
def random_date():

    year = random.choice(range(2000, 2010))
    month = random.choice(range(1, 13))
    day = random.choice(range(1, 29))
    return datetime(year, month, day)

# Random df
df = pd.DataFrame()
df['date'] = [random_date() for i in range(100)]
df['brand'] = [random.choice(['A','B','C']) for i in range(100)]
df['var1'] = np.random.randint(0,100,size=(100, 1))

df.head()

    date    brand   var1
0   2003-03-27  B   16
1   2009-06-24  C   7
2   2008-04-17  A   82
3   2004-02-20  C   9
4   2007-05-10  B   69

然后,要为每个品牌创建单独的线条图,请执行以下操作:

for brand in ['A', 'B', 'C']:

    # Subset df by brand
    sub = df[df['brand']==brand]

    # Make Series object
    ts = pd.Series(data=list(sub['var1']),index=sub['date'])

    # Plot
    ts.plot()
    plt.title('Brand {}'.format(brand))
    plt.show()

这是输出: enter image description here