You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过自定义函数创建哑变量?Python Pandas实现咨询

如何用函数创建哑变量Treated

我来帮你搞定这个哑变量创建的问题!先看看你原代码里的几个小坑,然后一步步修正:

原代码的问题

  • ix方法已经被Pandas弃用啦,现在推荐用loc或者iloc来定位行/列,避免版本兼容问题
  • 判断条件group.ix[group.year==3, 'pop']!=0返回的是一个布尔Series,而不是单个布尔值,没法直接用来做if判断(每个state只有1条year=3的数据,得把它转成标量值)
  • 你的treat函数修改了group,但没有返回修改后的结果;而且groupby.apply默认不会直接修改原DataFrame,需要把结果赋值回去

修正后的实现方法

方法一:修正自定义函数+groupby.apply

先调整你的自定义函数,让它能正确返回修改后的分组,再赋值回原DataFrame:

import numpy as np 
import pandas as pd 

data={'state':[1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4], 'year':[1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3], 'pop':[11, 22, 0, 33, 44, 32, 45, 66, 34, 12, 32, 0], 'gdp':[123, 341, 554, 654, 245, 665, 332 ,321, 344, 232, 542, 221]} 
frame=pd.DataFrame(data) 

def treat(group):
    # 提取当前state下year=3的pop值,用iloc[0]转成标量
    pop_year3 = group.loc[group['year'] == 3, 'pop'].iloc[0]
    # 根据条件赋值Treated
    group['Treated'] = 1 if pop_year3 != 0 else 0
    return group  # 必须返回修改后的分组

# 将apply的结果赋值回原frame
frame = frame.groupby('state').apply(treat)

方法二:更简洁的映射法(无需自定义函数)

如果逻辑比较简单,其实可以不用自定义函数,直接通过映射实现,效率更高:

# 先筛选year=3的行,以state为索引,标记pop是否非0(转成int类型:True→1,False→0)
state_treated_map = frame.loc[frame['year'] == 3].set_index('state')['pop'].ne(0).astype(int)
# 把每个state对应的Treated值映射到整个DataFrame
frame['Treated'] = frame['state'].map(state_treated_map)

两种方法最终都会得到你想要的Treated列:每个state下的所有行,只要该state在year=3时pop≠0,就标记为1,否则为0。

内容的提问来源于stack exchange,提问作者alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:39:43