【发布时间】:2023-04-09 19:48:01
【问题描述】:
这是我的数据集:
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 个 - 我不能将它附加回数据帧,因为长度不再相同......因此,不确定这是否是最好的选择。
请通过查看上面的代码让我知道解决此问题的明智方法是什么,以便打印的每个数据点都是供应商每个月的中值。非常感谢您的帮助!
【问题讨论】:
-
我认为我现在正走在正确的道路上:
for i in vendor_list: vendor_df=some_df.loc[some_df['Vendor']==i] a=vendor_df.groupby(vendor_df.Month)[['Observation']].median()似乎这将提供我可以从中绘制的独特数据帧...... -
我认为您的数据样本缺少
ob1的定义 -
@vestland 我忘了将它包含在我的示例代码中,现在将更新...我希望问题就这么简单
-
从来没有说它是 =)
-
@vestland 一切都好!我只是自己想出了答案:)
标签: python pandas plotly scatter-plot median