这是我的数据集:

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)


看起来像这样:

python - Python/Plotly:如何使散点图上的每个数据点代表中间值?-LMLPHP

这是我的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))


它将显示如下内容:
python - Python/Plotly:如何使散点图上的每个数据点代表中间值?-LMLPHP
Y轴显示观测值(1-10),X轴显示月份(1-12)

这是问题所在:

python - Python/Plotly:如何使散点图上的每个数据点代表中间值?-LMLPHP

我尝试在各处应用中位数(),但无法使我的绘图代表每个月的中位数观测值...例如,这是到目前为止我想出的结果(就逻辑而言):

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)


上面的代码确实返回了中间值,并且一切正常,但是现在有些值从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)
...

08-17 05:53
查看更多