Python/Plotly: 如何让散点图上的每个数据点代表中值?

Python/Plotly: How to make each data point on Scatter plot represent median value?

这是我的数据集:

ob1=np.linspace(1, 10, 13).round(2).tolist()
ob2=np.linspace(10, 1, 12).round(2).tolist()
ob=ob1+ob2

ex_dic={'Vendor':['A','A','A','A','A','A','A','A','A','A','A','A','A','B','B','B','B','B','B','B','B','B','B','B','B'],
       'Month':[1,1,2,3,4,5,6,7,8,9,10,11,12,1,2,3,4,5,6,7,8,9,10,11,12],
       'Observation':ob
       }
ex_df=pd.DataFrame.from_dict(ex_dic)

看起来像这样:

这是我的 Plotly 可视化代码:

ex_month_list=ex_df.Month.unique().tolist()
ex_vendor_list=ex_df.Vendor.unique().tolist()

fig=go.Figure()

for i in ex_vendor_list:
    by_vendor_df=ex_df.loc[ex_df['Vendor']==i]
    fig.add_trace(go.Scatter(x=by_vendor_df.Month, y=by_vendor_df.Observation, name=str(i),
                             mode='lines+markers', marker_line_width=2, marker_size=8))

它将显示如下内容: Y-axis 显示观察值 (1-10),X-axis 显示月份 (1-12)

这里是问题所在:

我试过在这里和那里应用 median() 但无法使我的情节代表每个月的中位数观察...例如,这是我到目前为止想出的(在逻辑方面):

for i in vendor_list:
    vendor_df=some_df.loc[some_df['Vendor']==i]
    for m in month_list:
        month_df=vendor_df.loc[vendor_df['Month']==m]
        by_month_observations=month_df['Observation'].to_list()
        median_val=stat.median(by_month_observations)
        print(median_val)

上面的代码确实 return 中值并且它工作得很好,但是现在一些值从 2 个观察值变为 1 - 我不能将它附加回数据框,因为长度不再相同......因此,不确定这是否是最好的方法。

请通过查看上面的代码让我知道执行此操作的明智方法是什么,以便打印的每个数据点都是 供应商每个月的中值 .非常感谢您的帮助!

好吧,我自己想出了办法 - 简单地使用 .groupby() 就完成了!

这是我用来解决问题的 df:

some_dic={'Vendor':['A','A','A','A','B','B','B','B','B'],
       'Month':[6,7,8,8,6,7,8,8,8],
       'Observation':[1,2,3,4,10,8,6,3,1]
         }
some_df=pd.DataFrame.from_dict(some_dic)

这是成功生成中值图的代码:

...
grouped_df=vendor_df.groupby(vendor_df.Month)[['Observation']].median()
grouped_df.reset_index(inplace=True)
...