Python DataFrame分组条形图制作求助:按sex与age分别可视化
分组条形图实现方案(按sex和age展示target分布)
你要基于以下结构的DataFrame制作分组条形图,同时按sex和age维度展示target的分布,但用df.groupby('sex')[target].value_counts().plot.bar(legend=True)代码没得到预期效果:
| age | sex | target |
|---|---|---|
| 25 | m | 0 |
| 33 | f | 0 |
| 20 | m | 1 |
| 37 | f | 1 |
| 40 | f | 1 |
问题分析
你之前的代码只按sex分组统计target,完全没结合age维度,肯定出不来同时展示两个维度的分组条形图。要实现预期效果,得先把数据处理成age、sex、target三者的交叉统计形式,再绘图。
解决方案
先把DataFrame实例化(方便你直接测试):
import pandas as pd data = { 'age': [25, 33, 20, 37, 40], 'sex': ['m', 'f', 'm', 'f', 'f'], 'target': [0, 0, 1, 1, 1] } df = pd.DataFrame(data)
方案1:按年龄+性别展示Target总计数
用pd.crosstab构建交叉表,直接生成分组条形图:
import matplotlib.pyplot as plt # 构建交叉表:行是年龄,列是性别,值为对应组的Target计数 cross_tab = pd.crosstab(index=df['age'], columns=df['sex'], values=df['target'], aggfunc='count').fillna(0) # 绘制分组条形图 cross_tab.plot(kind='bar', figsize=(8, 5)) plt.title('Target分布(按年龄、性别分组)') plt.xlabel('年龄') plt.ylabel('Target计数') plt.legend(title='性别') plt.tight_layout() plt.show()
方案2:按年龄+性别拆分展示Target具体值
如果要每个年龄-性别组下,分别展示target=0和target=1的数量,用下面的代码:
# 构建交叉表:行是年龄,列是(性别,Target值),值为对应组的数量 cross_tab_target = pd.crosstab(index=df['age'], columns=[df['sex'], df['target']], aggfunc='count').fillna(0) # 绘制分组条形图 cross_tab_target.plot(kind='bar', figsize=(10, 6)) plt.title('Target值分布(按年龄、性别分组)') plt.xlabel('年龄') plt.ylabel('数量') plt.legend(title='性别-Target') plt.tight_layout() plt.show()
根据你预期的图表样式,选对应的方案即可。
内容的提问来源于stack exchange,提问作者Ihavequestions
相关产品推荐
相关产品推荐

