lhk*_*lhk 4 python pandas seaborn
问题:我正在将结果分组到我的数据框中,查看value_counts(normalize=True)并尝试在条形图中绘制结果。
问题是条形图应该包含频率。在某些组中,某些值不会出现。那么对应的value_count就不是0,不存在。对于条形图,不考虑此 0 值,并且生成的条形图太大。
示例:这是一个最小的示例,它说明了问题:假设 DataFrame 包含实验观察结果。当您执行此类实验时,会收集一系列观察结果。实验的结果是为其收集的观测值的相对频率。
df = pd.DataFrame()
df["id"] = [1]*3 + [2]*3 + [3]*3
df["experiment"] = ["a"]*6 + ["b"] * 3
df["observation"] = ["positive"]*3 + ["positive"]*2 + ["negative"]*1 + ["positive"]*2 + ["negative"]*1
Run Code Online (Sandbox Code Playgroud)
所以这里,实验a做了2次,实验b只做了一次。
我需要按 id 和实验进行分组,然后对结果进行平均。
plot_frame = pd.DataFrame(df.groupby(["id", "experiment"])["observation"].value_counts(normalize=True))
plot_frame = plot_frame.rename(columns={"observation":"percentage"})
Run Code Online (Sandbox Code Playgroud)
从上图中,你已经可以看出问题所在了。id 1 的评估仅看到积极的观察结果。“负”的相对频率应该是0。相反,它不存在。如果我绘制此图,相应的条形图太高,蓝色条形加起来应该为 1:
sns.barplot(data=plot_frame.reset_index(),
x="observation",
hue="experiment",
y="percentage")
plt.show()
Run Code Online (Sandbox Code Playgroud)
您可以使用带有参数的unstack/方法来添加填充为 0 的行。尝试这个:stackfill_value=0
df.groupby(["id", "experiment"])["observation"].value_counts(normalize=True).unstack(fill_value=0).stack()
Run Code Online (Sandbox Code Playgroud)