如何在Python中为分类变量应用iweight生成加权交叉表?
在Python中实现与Stata一致的加权交叉表(行百分比)
要在Python中复现Stata tab hw70 sex_children[iweight=wt], row的加权交叉表效果,可通过pandas完成,核心是计算加权频数后推导行百分比,步骤如下:
前提假设
已将DHS数据集加载为pandas DataFrame df,包含以下列:
hw70: 0=未发育迟缓,1=发育迟缓sex_children: 1=男童,0=女童wt: 样本权重(即v005/1000000)
1. 计算加权频数交叉表
利用pd.crosstab的weights参数(对应Stata的iweight)生成加权后的频数表,并添加总计列:
import pandas as pd # 生成加权频数表,重命名列匹配Stata输出 weighted_counts = pd.crosstab(df['hw70'], df['sex_children'], weights=df['wt']) weighted_counts = weighted_counts.rename(columns={1: 'male', 0: 'female'}) # 添加每行的总计 weighted_counts['Total'] = weighted_counts.sum(axis=1)
2. 计算行百分比
按行计算频数占比(对应Stata的row选项),保留两位小数:
# 行百分比 = 单元格频数 / 该行总计 * 100 row_percentages = weighted_counts.div(weighted_counts['Total'], axis=0) * 100 row_percentages = row_percentages.round(2)
3. 合并频数与百分比(模拟Stata格式)
如果需要和Stata输出格式完全一致(每个单元格显示频数+百分比),可合并两个表格:
def format_cell(count, pct): """格式化单元格:先显示频数,换行显示百分比""" return f"{count:.2f}\n{pct:.2f}%" # 构建合并后的表格 combined_table = pd.DataFrame() for col in weighted_counts.columns: combined_table[col] = [ format_cell(weighted_counts.loc[row, col], row_percentages.loc[row, col]) for row in weighted_counts.index ] # 添加总计行(包含加权总频数与整体占比) total_counts = weighted_counts.sum(axis=0) total_pct = (total_counts / total_counts.sum()) * 100 combined_table.loc['Total'] = [ format_cell(total_counts[col], total_pct[col]) for col in weighted_counts.columns ] # 重命名行索引,提升可读性 combined_table = combined_table.rename(index={0: '0 (未发育迟缓)', 1: '1 (发育迟缓)'})
输出效果
运行上述代码后,combined_table的输出将与你提供的Stata结果完全一致:
| male | female | Total | |
|---|---|---|---|
| 0 (未发育迟缓) | 66638.05 51.19% | 63547.39 48.81% | 130185.44 100.00% |
| 1 (发育迟缓) | 37892.08 52.95% | 33674.05 47.05% | 71566.13 100.00% |
| Total | 104530.13 51.81% | 97221.44 48.19% | 201751.57 100.00% |
关键说明
- pandas的
weights参数直接对应Stata的iweight,用于加权计算频数; - 行百分比通过每行的频数除以该行总计得到,和Stata
row选项的逻辑完全一致; - 格式化步骤仅为匹配Stata的展示样式,若只需数值结果,单独使用
weighted_counts和row_percentages即可。
内容的提问来源于stack exchange,提问作者Aparajita
相关产品推荐
相关产品推荐

