gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:11:45 25 4
gpt4 key购买 nike

问题:我正在对 DataFrame 中的结果进行分组,查看 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

dataframe

  • 有两种实验类型:“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"})

plot_frame

从上图中,你已经可以看出问题所在了。 id 1 的评估仅看到积极的观察结果。 “负”的相对频率应该是0。相反,它不存在。如果我绘制此图,相应的条形图太高,蓝色条形图加起来应该为 1:

sns.barplot(data=plot_frame.reset_index(), 
x="observation",
hue="experiment",
y="percentage")

plt.show()

barplot

最佳答案

您可以使用带有参数 fill_value=0unstack/stack 方法来添加用 0 填充的行。试试这个:

df.groupby(["id", "experiment"])["observation"].value_counts(normalize=True).unstack(fill_value=0).stack()

关于python - pandas 对于 value_counts() 中不存在的类别填写 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58181966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com