【问题标题】:Plot groupby of groupby pandas绘制 groupby 熊猫的 groupby
【发布时间】:2020-03-25 10:43:06
【问题描述】:

数据是一个时间序列,有很多成员id关联很多类别:

data_df = pd.DataFrame({'Date': ['2018-09-14 00:00:22',
                            '2018-09-14 00:01:46',
                            '2018-09-14 00:01:56',
                            '2018-09-14 00:01:57',
                            '2018-09-14 00:01:58',
                            '2018-09-14 00:02:05'],
                    'category': [1, 1, 1, 2, 2, 2],
                    'member': ['bob', 'joe', 'jim', 'sally', 'jane', 'doe'],
                    'data': ['23', '20', '20', '11', '16', '62']})

大约有 50 个类别,有 30 个成员,每个类别都有大约 1000 个数据点。

我正在尝试为每个类别制作一个情节。

通过对每个类别进行子集化,然后通过以下方式绘制:

fig, ax = plt.subplots(figsize=(8,6))
for i, g in category.groupby(['memeber']):
    g.plot(y='data', ax=ax, label=str(i))

plt.show()

这适用于单个类别,但是,当我尝试使用 for 循环为每个类别重复此操作时,它不起作用

tests = pd.DataFrame()
for category in categories:
    tests = df.loc[df['category'] == category]
    for test in tests:
        fig, ax = plt.subplots(figsize=(8,6))
        for i, g in category.groupby(['member']):
            g.plot(y='data', ax=ax, label=str(i))

            plt.show()

产生“AttributeError: 'str' object has no attribute 'groupby'”错误。

我想要的是一个循环,每个类别输出一个图表,所有成员的数据都绘制在每个图表上

【问题讨论】:

    标签: python pandas for-loop matplotlib pandas-groupby


    【解决方案1】:

    创建你的数据框

    import pandas as pd
    
    data_df = pd.DataFrame({'Date': ['2018-09-14 00:00:22',
                                '2018-09-14 00:01:46',
                                '2018-09-14 00:01:56',
                                '2018-09-14 00:01:57',
                                '2018-09-14 00:01:58',
                                '2018-09-14 00:02:05'],
                        'category': [1, 1, 1, 2, 2, 2],
                        'member': ['bob', 'joe', 'jim', 'sally', 'jane', 'doe'],
                        'data': ['23', '20', '20', '11', '16', '62']})
    

    然后[在 cmets 之后编辑]

    import matplotlib.pyplot as plt
    import numpy as np
    
    subplots_n = np.unique(data_df['category']).size
    subplots_x = np.round(np.sqrt(subplots_n)).astype(int)
    subplots_y = np.ceil(np.sqrt(subplots_n)).astype(int)
    
    for i, category in enumerate(data_df.groupby('category')):
        category_df = pd.DataFrame(category[1])
        x = [str(x) for x in category_df['member']]
        y = [float(x) for x in category_df['data']]
        plt.subplot(subplots_x, subplots_y, i+1)
        plt.plot(x, y)
        plt.title("Category {}".format(category_df['category'].values[0]))
    
    plt.tight_layout()
    plt.show()
    

    屈服于

    请注意,这也很好地照顾到更大的群体,例如

    data_df2 = pd.DataFrame({'category': [1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 5],
                        'member': ['bob', 'joe', 'jim', 'sally', 'jane', 'doe', 'ric', 'mat', 'pip', 'zoe', 'qui', 'quo', 'qua'],
                        'data': ['23', '20', '20', '11', '16', '62', '34', '27', '12', '7', '9', '13', '7']})
    

    【讨论】:

    • 这几乎正是我正在寻找的,希望我希望每个类别都有单独的图,而不是所有类别的 1 个图
    • @Evan 我已经在下面更新了我的答案,请随意看看。
    【解决方案2】:

    远非pandas专家,但如果你执行以下足够简单的sn-p

    import matplotlib.pyplot as plt
    import pandas as pd
    
    df = pd.DataFrame({'Date': ['2018-09-14 00:00:22',
                                '2018-09-14 00:01:46',
                                '2018-09-14 00:01:56',
                                '2018-09-14 00:01:57',
                                '2018-09-14 00:01:58',
                                '2018-09-14 00:02:05'],
                       'category': [1, 1, 1, 2, 2, 2],
                       'Id': ['bob', 'joe', 'jim', 'sally', 'jane', 'doe'],
                       'data': ['23', '20', '20', '11', '16', '62']})
    fig, ax = plt.subplots()
    for item in df.groupby('category'):
        ax.plot([float(x) for x in item[1]['category']],
                [float(x) for x in item[1]['data'].values],
                linestyle='none', marker='D')
    plt.show()
    

    你制作这个图

    但可能有更好的方法。

    编辑:根据对您的问题所做的更改,我将 sn-p 更改为

    import matplotlib.pyplot as plt
    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({'Date': ['2018-09-14 00:00:22',
                                '2018-09-14 00:01:46',
                                '2018-09-14 00:01:56',
                                '2018-09-14 00:01:57',
                                '2018-09-14 00:01:58',
                                '2018-09-14 00:02:05'],
                       'category': [1, 1, 1, 2, 2, 2],
                       'Id': ['bob', 'joe', 'jim', 'sally', 'jane', 'doe'],
                       'data': ['23', '20', '20', '11', '16', '62']})
    fig, ax = plt.subplots(nrows=np.unique(df['category']).size)
    for i, item in enumerate(df.groupby('category')):
        ax[i].plot([str(x) for x in item[1]['Id']],
                   [float(x) for x in item[1]['data'].values],
                   linestyle='none', marker='D')
        ax[i].set_title('Category {}'.format(item[1]['category'].values[0]))
    fig.tight_layout()
    plt.show()
    

    现在显示

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2019-02-24
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      相关资源
      最近更新 更多