Python中如何统计各年龄对应唯一ID数并绘制带性别区分的图表?
统计各年龄唯一ID数量并按性别绘图
数据集
| ID | AGE | SEX |
|---|---|---|
| 25 | 11 | 1 |
| 25 | 12 | 1 |
| 18 | 11 | 1 |
| 18 | 12 | 2 |
| 18 | 13 | 2 |
| 199 | 11 | 1 |
| 409 | 11 | 1 |
需求
统计每个年龄对应的唯一ID数量,并用hue参数按性别区分绘图,无需显示ID编号,仅展示各年龄对应不同ID的出现情况。
此前尝试的代码
for an_id in df.ID.unique(): if (len(df[df['ID'] == an_id]['AGE'].unique()))==1: print(an_id, df[df['ID'] == an_id]['AGE'].unique()[0]) else: print(an_id,df[df['ID']==an_id]['AGE'].unique())
问题在于部分ID对应多个年龄,使用unique()会得到年龄列表,无法直接用于统计绘图。
解决方案
1. 数据去重
先对ID、AGE、SEX的组合去重,确保每个ID在对应年龄和性别下仅保留一条记录,避免重复计数:
unique_df = df.drop_duplicates(subset=['ID', 'AGE', 'SEX'])
2. 分组统计唯一ID数量
按AGE和SEX分组,统计每组的唯一ID数量:
count_df = unique_df.groupby(['AGE', 'SEX'])['ID'].nunique().reset_index(name='Unique ID Count')
3. 绘图展示
使用seaborn绘制柱状图,通过hue参数按性别区分:
import seaborn as sns import matplotlib.pyplot as plt sns.barplot(data=count_df, x='AGE', y='Unique ID Count', hue='SEX') plt.title('Unique ID Count by Age and Sex') plt.xlabel('Age') plt.ylabel('Number of Unique IDs') plt.show()
效果说明
- 去重步骤解决了同一ID对应多年龄/性别的重复计数问题
- 分组统计后得到的
count_df直接满足绘图所需的结构 - 绘图时
hue=SEX自动将不同性别的数据用不同颜色区分,清晰展示各年龄下不同性别对应的唯一ID数量分布
内容的提问来源于stack exchange,提问作者dspractician
相关产品推荐
相关产品推荐

