如何用Python/Pandas从汇总人口普查数据生成个体级模拟数据集?
可以用Pandas实现这个需求,以下是具体步骤和代码示例
核心思路
将各分类的计数转换为对应重复次数的列表,再组合成包含Person、Gender、Transport、Marriage_Status字段的结构化数据集,总条数刚好匹配1000条。
情况1:汇总表为两列格式(Category + Count)
假设你的Excel汇总表结构如下(Sheet1):
| Category | Count |
|---|---|
| Male | 500 |
| Female | 500 |
| Car | 200 |
| Bike | 200 |
| Walk | 600 |
| Married | 450 |
| Not Married | 550 |
对应的实现代码:
import pandas as pd import numpy as np # 读取Excel汇总数据 df_summary = pd.read_excel('census_summary.xlsx', sheet_name='Sheet1') # 拆分不同维度的分类数据 gender_groups = df_summary[df_summary['Category'].isin(['Male', 'Female'])] transport_groups = df_summary[df_summary['Category'].isin(['Car', 'Bike', 'Walk'])] marriage_groups = df_summary[df_summary['Category'].isin(['Married', 'Not Married'])] # 生成各字段的重复值列表 gender_list = [] for _, row in gender_groups.iterrows(): gender_list.extend([row['Category']] * row['Count']) transport_list = [] for _, row in transport_groups.iterrows(): transport_list.extend([row['Category']] * row['Count']) marriage_list = [] for _, row in marriage_groups.iterrows(): marriage_list.extend([row['Category']] * row['Count']) # 随机打乱列表(可选,避免数据顺序固化,更贴近真实抽样) np.random.shuffle(gender_list) np.random.shuffle(transport_list) np.random.shuffle(marriage_list) # 构建最终的单条记录数据集 individual_records = pd.DataFrame({ 'Person': range(1, 1001), # 生成1-1000的受访者唯一ID 'Gender': gender_list, 'Transport': transport_list, 'Marriage_Status': marriage_list }) # 保存结果到新Excel文件 individual_records.to_excel('individual_census_records.xlsx', index=False)
情况2:汇总表为单行列名格式
如果你的Excel汇总表是单一行,列名为分类名称,值为对应计数:
| Male | Female | Car | Bike | Walk | Married | Not Married |
|---|---|---|---|---|---|---|
| 500 | 500 | 200 | 200 | 600 | 450 | 550 |
可以简化代码:
import pandas as pd import numpy as np df_summary = pd.read_excel('census_summary.xlsx', sheet_name='Sheet1') # 直接从列名和对应值生成重复列表 gender_list = ['Male'] * df_summary['Male'].iloc[0] + ['Female'] * df_summary['Female'].iloc[0] transport_list = ['Car'] * df_summary['Car'].iloc[0] + ['Bike'] * df_summary['Bike'].iloc[0] + ['Walk'] * df_summary['Walk'].iloc[0] marriage_list = ['Married'] * df_summary['Married'].iloc[0] + ['Not Married'] * df_summary['Not Married'].iloc[0] # 随机打乱(可选) np.random.shuffle(gender_list) np.random.shuffle(transport_list) np.random.shuffle(marriage_list) # 构建数据集并保存 individual_records = pd.DataFrame({ 'Person': range(1, 1001), 'Gender': gender_list, 'Transport': transport_list, 'Marriage_Status': marriage_list }) individual_records.to_excel('individual_census_records.xlsx', index=False)
关键说明
- 不需要额外工具包,仅用Pandas和Numpy(Numpy仅用于随机打乱,可选)即可完成
- 随机打乱步骤可根据需求省略,如果需要保持分类的原始顺序(比如前500条都是Male)可以去掉这部分
- 最终生成的
Person字段为1到1000的连续整数,作为每条记录的唯一标识
内容的提问来源于stack exchange,提问作者Raihan Choudhury
相关产品推荐
相关产品推荐

