如何使用pandas动态生成绘图所需的年龄与分性别计数嵌套列表
实现方案
你原有代码存在两处可优化点:
- 过滤条件中将变量
cat写死为字符串'cat',无法匹配到真实的性别值 - 未提前定义列表容器存储统计结果,生成的计数无法汇总成你需要的嵌套结构
方法1:基于你的原有逻辑修改
import pandas as pd # 示例数据集 data = {'age':[21, 21, 21, 20, 20, 20, 21, 20, 20, 21, 19, 20, 19, 21, 20, 19, 19, 20, 21, 21], 'sex':['F', 'M', 'M', 'M', 'M', 'F', 'M', 'F', 'M', 'F', 'F', 'F', 'M', 'M', 'F', 'M', 'M', 'M', 'F', 'M']} user_data = pd.DataFrame(data, columns=['age','sex']) # 获取x轴:排序后的年龄列表 x = sorted(user_data['age'].unique().tolist()) # 获取性别分类,固定顺序为女性在前、男性在后,和你示例结构对应 sex_categories = ['F', 'M'] # 初始化y的嵌套列表,每个性别对应一个空列表 y = [[] for _ in sex_categories] # 遍历每个年龄,统计对应性别的计数 for age in x: for idx, sex in enumerate(sex_categories): count = user_data[(user_data['age'] == age) & (user_data['sex'] == sex)].shape[0] y[idx].append(count)
执行后输出的结构和你要求完全一致:
x= [19, 20, 21]y= [[1, 4, 3], [3, 4, 5]] (依次对应女性各年龄计数、男性各年龄计数)
方法2:使用pandas内置函数更高效实现
不需要自己写循环,直接用交叉表统计,性能更高,代码更简洁:
# 统计每个年龄下的分性别计数 count_df = pd.crosstab(user_data['age'], user_data['sex']) # 按要求提取x和y x = count_df.index.tolist() y = [count_df['F'].tolist(), count_df['M'].tolist()]
得到的结果和方法1完全一致。
内容的提问来源于stack exchange,提问作者Kyon
相关产品推荐
相关产品推荐

