我创建了以下DataFrame:
dataset = pd.DataFrame(np.random.randint(0,3,size=(5, 8)), columns=list('ABCDEFGH'))
现在我想显示每列中每个值(0,1,2(的比例。理想情况下,我想将其表示为堆叠条形图-x轴上的列名(因此从a到H总共有8个条形图(,条形图上的不同颜色代表每个值的比例(0,1,2(。
做这件事最简单/最简洁的方法是什么?
编辑:我找到了一种简单的方法来表示比例——不是用条形图,而是用DataFrame。见下文:
df = pd.concat([dataset['A'].value_counts(normalize=True).mul(100),
dataset['B'].value_counts(normalize=True).mul(100),
dataset['C'].value_counts(normalize=True).mul(100),
dataset['D'].value_counts(normalize=True).mul(100),
dataset['E'].value_counts(normalize=True).mul(100),
dataset['F'].value_counts(normalize=True).mul(100),
dataset['G'].value_counts(normalize=True).mul(100),
dataset['H'].value_counts(normalize=True).mul(100)],
axis=1,keys=('proportions A','proportions B',
'proportions C', 'proportions D',
'proportions E', 'proportions F',
'proportions G', 'proportions H'))
然而,有没有一种更简洁的编码方法呢?例如,无论如何都要把上面的代码变成一个循环?
这似乎是最有效的方法。就缩短而言,这就是你想要的吗?这真的是你的解决方案,只是通过理解来浓缩。
df = pd.concat([dataset[colid].value_counts(normalize=True).mul(100) for colid in list('ABCDEFGH')],
axis=1,keys=('proportions ' + colid for colid in list('ABCDEFGH')))
print(df)
导致
proportions A proportions B proportions C proportions D proportions E
0 NaN 20.0 NaN 60.0 20.0
1 80.0 40.0 40.0 20.0 40.0
2 20.0 40.0 60.0 20.0 40.0
proportions F proportions G proportions H
0 20.0 40.0 80.0
1 40.0 40.0 20.0
2 40.0 20.0 NaN