这是我的数据集:
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轴显示观测值(1-10),X轴显示月份(1-12)
这是问题所在:
我尝试在各处应用中位数(),但无法使我的绘图代表每个月的中位数观测值...例如,这是到目前为止我想出的结果(就逻辑而言):
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)
...