【发布时间】:2017-08-21 19:13:43
【问题描述】:
我有一个将连续值映射到离散类别的数据集。我想显示一个直方图,其中连续值为 x,类别为 y,其中条形图是堆叠和标准化的。示例:
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
df = pd.DataFrame({
'score' : np.random.rand(1000),
'category' : np.random.choice(list('ABCD'), 1000)
},
columns=['score', 'category'])
print df.head(10)
输出:
score category
0 0.649371 B
1 0.042309 B
2 0.689487 A
3 0.433064 B
4 0.978859 A
5 0.789140 C
6 0.215758 D
7 0.922389 B
8 0.105364 D
9 0.010274 C
如果我尝试使用df.hist(by='category') 将其绘制为直方图,我会得到 4 个图表:
我设法得到了我想要的图表,但我必须做很多操作。
# One column per category, 1 if maps to category, 0 otherwise
df2 = pd.DataFrame({
'score' : df.score,
'A' : (df.category == 'A').astype(float),
'B' : (df.category == 'B').astype(float),
'C' : (df.category == 'C').astype(float),
'D' : (df.category == 'D').astype(float)
},
columns=['score', 'A', 'B', 'C', 'D'])
# select "bins" of .1 width, and sum for each category
df3 = pd.DataFrame([df2[(df2.score >= (n/10.0)) & (df2.score < ((n+1)/10.0))].iloc[:, 1:].sum() for n in range(10)])
# Sum over series for weights
df4 = df3.sum(1)
bars = pd.DataFrame(df3.values / np.tile(df4.values, [4, 1]).transpose(), columns=list('ABCD'))
bars.plot.bar(stacked=True)
我希望有一种更直接的方法可以做到这一点,更易于阅读和理解,并且通过更少的中间步骤进行更优化。有什么解决办法吗?
【问题讨论】:
标签: python pandas numpy matplotlib