【问题标题】:Plot bars with no observations没有观察值的绘图条
【发布时间】:2021-12-21 18:19:42
【问题描述】:

此代码生成以下图:

df.groupby(['bin'],observed=True)['Clicked'].value_counts(ascending=True,normalize=True).unstack().plot(kind='bar' ,stacked=True,color=['C0','C3'],alpha=0.8)
plt.legend(title="Clicked on:")
plt.title("")

这是unstack()之后的sn-p数据:

Clicked       Real & Rep    Rep only
bin     
(-0.5, -0.45]   0.333333    0.666667
(-0.4, -0.35]   NaN         1.000000
(-0.25, -0.2]   0.500000    0.500000
(-0.15, -0.1]   0.400000    0.600000
(-0.1, -0.05]   0.400000    0.600000
(-0.05, 0.0]    0.488889    0.511111
(0.0, 0.05] 0.228782    0.771218
(0.05, 0.1] 0.141818    0.858182
(0.1, 0.15] 0.067797    0.932203
(0.15, 0.2] 0.121622    0.878378
(0.2, 0.25] 0.054054    0.945946
(0.25, 0.3] 0.089744    0.910256

如您所见,某些 bin 没有观测值 [(-0.45,-0.4),(-0.35,-0.3),(-0.3,-0.25),(-0.2,-0.15)]。 我该怎么做才能在图中显示丢失的垃圾箱(空)? 我必须将 observed=True 包含在 groupby 中,否则我会出错。

【问题讨论】:

  • 请运行 df.groupby(['bin'],observed=True)['Clicked'].value_counts(ascending=True,normalize=True).unstack() 在您的源数据上并发布结果。我想在 plot 之前需要一些中间步骤,但是我没有时间自己生成这些数据。
  • @Valdi_Bo 完成 :)

标签: python pandas plot


【解决方案1】:

你只有一些间隔的原因是你通过了 observed=True,所以 groupby 的结果并不包含所有区间 (省略没有源数据的区间)。

我生成了源 DataFrame,其索引包含所有连续的间隔 在你的范围内:

Clicked        Real & Rep  Rep only
bin                                
(-0.5, -0.45]    0.333333  0.666667
(-0.45, -0.4]         NaN       NaN
(-0.4, -0.35]         NaN  1.000000
(-0.35, -0.3]         NaN       NaN
(-0.3, -0.25]         NaN       NaN
(-0.25, -0.2]    0.500000  0.500000
(-0.2, -0.15]         NaN       NaN
(-0.15, -0.1]    0.400000  0.600000
(-0.1, -0.05]    0.400000  0.600000
(-0.05, 0.0]     0.488889  0.511111
(0.0, 0.05]      0.228782  0.771218
(0.05, 0.1]      0.141818  0.858182
(0.1, 0.15]      0.067797  0.932203
(0.15, 0.2]      0.121622  0.878378
(0.2, 0.25]      0.054054  0.945946
(0.25, 0.3]      0.089744  0.910256

然后我运行你的代码并得到:

如您所见,所有间隔。

第一个建议是去掉observed参数。

或者,如果您只想拥有范围的一部分,重新索引您的 索引包含适当区间范围的中间结果。

另一个建议是将图例移到图像之外。 为此,请运行:

df.plot.bar(stacked=True, color=['C0','C3'], alpha=0.8)
plt.legend(title='Clicked on:', loc='upper left', bbox_to_anchor=(1.02, 1.0))
plt.title("");

图例将在图像的右侧。

【讨论】:

  • 它不允许我在没有observed=True 的情况下运行groupby.value_counts()。错误是ValueError: operands could not be broadcast together with shape (18,) (12,)
  • 尝试 reindex 以获取具有所有间隔的源。
  • 我试过df.groupby(['bin']).apply(lambda x: x.Clicked.value_counts(ascending=True,normalize=True)).unstack().reindex(df['bin'].unique()),但输出仍然缺少那些空垃圾箱。我应该把重新索引放在其他地方吗?
  • 您应该在单独的指令中创建索引,包括所有区间。然后你应该把它传递给reindex。你所做的不会改变任何事情。
  • 那 df['bin'].unique() 片段创建了一个包含所有类别(包括没有观察的类别)的列表,我该怎么做呢?在您输入答案的源数据框中,您是如何添加缺少的类别的?是手动的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多