熊猫数据框:用分组绘制直方图
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)
输出:
我有 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)
输出: