非平衡面板数据中个体分类变量(职业)状态变化识别问题求助
解决非平衡面板数据中个体变量变化标记的报错问题
报错原因
你使用的diff()方法仅支持数值型数据运算,而job列是字符串类型,直接调用会触发类型错误。
完整解决方案
第一步:规整时间顺序
先把字符串格式的日期转为datetime类型,再按id和date排序,确保每个个体的观测记录是按时间先后排列的:
import pandas as pd df = pd.DataFrame( { "region": ["C1", "C1", "C2", "C2", "C2"], "id": [1, 1, 2, 2, 2], "date": ["01/01/2021", "01/02/2021", "01/01/2021", "01/02/2021", "01/03/2021"], "job": ["A", "A", "A", "B", "B"], } ) # 转换日期格式 df['date'] = pd.to_datetime(df['date'], format='%d/%m/%Y') # 按个体和日期排序 df = df.sort_values(by=['id', 'date']).reset_index(drop=True)
第二步:标记职业变化
用shift()方法获取每个个体上一行的职业值,和当前行对比来判断是否发生变化:
# 生成0/1标记:1表示职业变化,0表示无变化 df['change'] = df.groupby('id')['job'].apply(lambda x: x != x.shift()).astype(int) # 每个个体的第一条数据填充为0(无前置记录,不存在变化) df['change'] = df['change'].fillna(0)
如果需要更直观的变化详情(比如显示从A到B的具体变化),可以额外添加一列:
df['change_detail'] = df.groupby('id')['job'].apply(lambda x: x.shift() + '→' + x) df['change_detail'] = df['change_detail'].fillna('无前置数据')
最终输出
运行后得到的结果:
region id date job change change_detail 0 C1 1 2021-01-01 A 0 无前置数据 1 C1 1 2021-02-01 A 0 A→A 2 C2 2 2021-01-01 A 0 无前置数据 3 C2 2 2021-02-01 B 1 A→B 4 C2 2 2021-03-01 B 0 B→B
内容的提问来源于stack exchange,提问作者Suryadipta
相关产品推荐
相关产品推荐

