pandas 对于 value_counts() 中不存在的类别填写 0

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”和“b”
  • 属于同一实验评估的观察结果被赋予相同的 id。

所以这里,实验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)

条形图

mbh*_*h86 5

您可以使用带有参数的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)