熊猫数据框:用分组绘制直方图

Panda dataframe : plot histogram with grouping

我有 table 可用以下格式的数据:

id  value    valid
1   0.43323  true
2   0.83122  false
3   0.33132  true
4   0.58351  false
5   0.74143  true
6   0.44334  true
7   0.86436  false
8   0.73555  true
9   0.56534  false
10  0.66234  true
...

我正在尝试绘制这样的直方图

想知道是否有一种方法可以在 panda dataframe 中将数值从 .0 到 .1 然后 .1 到 .2 等分组,以表示数据,如图像中用颜色编码栏分别计算真假。

我想在字典中创建单独的切片,然后分别计算 true/false 值。稍后我可以用它创建直方图。有没有更好的方法来绘制这样的直方图而不进行所有这些计算?

到目前为止我对 bin 和 cut 的了解:

new_df = df[['value','valid']]
bins = [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]
s = new_df.groupby(pd.cut(new_df['value'], bins=bins)).size()
s.plot(kind='bar', stacked=True)

有了这个,我可以得到带有 bin 的总计数直方图,我无法为每个条应用 'valid' 列 true/false 计数的颜色编码。

尝试:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(123)

df = pd.DataFrame(
    {
        "value": np.random.random(1000),
        "valid": np.random.choice([True, False], p=[0.7, 0.3], size=1000),
    }
)

df["label"] = pd.cut(df["value"], bins=np.arange(0, 1.01, 0.1))

ax = (
    df.groupby(["label", "valid"])
    .count()
    .unstack()["value"]
    .plot.bar(stacked=True, rot=0, figsize=(10, 7))
)
ax.legend(loc="upper center")
ax.spines["right"].set_visible(False)
ax.spines["top"].set_visible(False)
_ = ax.set_ylim(0, 150)

输出: