如何完成指定Stata if-else语句到Python的完整转换?
问题:将指定Stata代码转换为Python代码
原Stata代码用于为无儿童人口统计数据的调查创建child_age_year变量,代码如下:
if inlist(nid, 4580, 4250, 165101, 4679, 236205, 419098, 438439, 11240, 317089, 430032, 3716, 164729) { capture confirm variable child_age_year if !_rc { replace child_age_year = 0 } else { gen child_age_year = 0 } }
我已写出转换后的开头代码,但不确定如何完成剩余部分:
if sum((df['nid'] == i).any() for i in [4580, 4250, 165101, 4679, 236205, 419098, 438439, 11240, 317089, 430032, 3716, 164729]) == 12:
请问如何完成剩余代码以复现原Stata代码的逻辑?
解决方案
首先你写的开头逻辑不符合原Stata代码:原代码是只要当前数据集的nid属于指定列表中的任意一个值,就执行后续操作;而你的代码是统计列表中有多少个值在nid列出现过,必须等于12才执行,这和原逻辑完全不符。
完整的Python实现代码
# 定义目标nid列表 target_nids = [4580, 4250, 165101, 4679, 236205, 419098, 438439, 11240, 317089, 430032, 3716, 164729] # 判断数据集是否包含目标nid中的任意一个 if df['nid'].isin(target_nids).any(): # 检查child_age_year变量是否存在 if 'child_age_year' in df.columns: # 存在则将整列替换为0 df['child_age_year'] = 0 else: # 不存在则新建变量并赋值0 df['child_age_year'] = 0
逻辑对应说明
df['nid'].isin(target_nids).any():对应Stata的inlist(nid, ...),判断数据集内是否有匹配的nid值'child_age_year' in df.columns:对应Stata的capture confirm variable,检查变量是否已存在- 变量存在时直接赋值0,不存在时创建变量并赋值0,完全复现原Stata代码的功能
内容的提问来源于stack exchange,提问作者Not a Wrench
相关产品推荐
相关产品推荐

