【问题标题】:pandas groupby and select value from aother column for ecah group for plottingpandas groupby 并从另一列中为每个组选择值进行绘图
【发布时间】:2022-08-20 00:34:44
【问题描述】:

我正在使用groupby() 并绘制每个组。我有一个数据框: 每个组具有相同的“正常”值

id  date  value  normal
1    5.2  20      200   
1    5.4  100     200
1    6.9   30     200
2    2.4   20     500
2    3.4   100    500

我想绘制每个组的日期和值列(对于 x、y 轴)并添加与组相对应的正常值的 axhline。我试过了:

ax = sns.scatterplot(\"date\", \"value\", data = data)
grouped = data.groupby(\'id\')
normal_val= grouped[\'normal\']
plt.axhline(normal_val,c=\'red\', ls=\':\')    #===> THIS LINE
plt.show()

但不起作用。希望有人能帮忙!谢谢

    标签: python pandas dataframe matplotlib seaborn


    【解决方案1】:

    参考突出显示的行,normal_val 有多个值,不确定您对哪一个感兴趣。

    print(data.groupby('id')[['normal']].mean())
    
         normal
    id         
    1.0   200.0
    2.0   500.0
    

    如果将行更改为如下所示,您将获得输出

    normal_val1 = 200
    normal_val2 = 500
    plt.axhline(normal_val1, c='red', ls=':')
    plt.axhline(normal_val2, c='green', ls='-.')
    

    编辑:根据您有多少“正常”值,您可以添加到颜色列表c。我从 8 开始,所以这段代码应该可以工作:

    import seaborn as sns
    import matplotlib.pyplot as plt
    
    ax = sns.scatterplot("date", "value", data = data)
    df = data.groupby('id')[['normal']].mean().reset_index()
    c = ['red', 'green', 'yellow', 'blue', 'navy', 'cyan', 'pink', 'brown']
    if len(df['normal']) <= len(c):
        for i, normal in enumerate(df['normal']):
            plt.axhline(normal, c=c[i], ls='-.')
    plt.show()
    

    【讨论】:

    • 我有多个图,为每个 id 绘制所以对于每个 id 图我想要对应的正常值
    • 当然,我已经修改了我的代码以允许更多值(现在最多 8 个),请看一下
    【解决方案2】:

    请注意,df.groupby('id').normal 本身没有意义。之后您应该对其应用聚合函数。否则,它只是一个 groupby 对象。我取每个 id 的正常值的平均值,但当然你可以使用它。

    normal_val = df.groupby('id').normal.mean()
    for item in normal_val:
        plt.axhline(y=item, c='red', ls=':')
    plt.show()
    

    【讨论】:

    • 我有多个图,为每个 id 绘制所以对于每个 id 图我想要对应的正常值
    【解决方案3】:

    这是因为grouped = data.groupby('id) 行返回pandas.core.groupby.generic.DataFrameGroupBy object

    您可能想尝试 -

    data = {
        "id": [1, 1, 1, 2, 2],
        "date":  [5.2, 5.4, 6.9, 2.4, 3.4],
        "value": [20, 100, 30, 20, 100],
        "normal": [200, 200, 200, 500, 500]
    }
    
    data = pd.DataFrame(data)
    
    for id in data["id"].unique():
        plot_data = data.loc[data["id"] == id]
        ax = sns.scatterplot("date", "value", data = plot_data)
        ax.axhline(plot_data["normal"].unique(), c='red', ls=':')
        plt.show()
    

    【讨论】:

    • 我有多个图,为每个 id 绘制所以对于每个 id 图我想要对应的正常值
    • 我已经更新为每个 id 绘图,看看它是否有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2022-06-13
    • 2022-01-19
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多