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

非平衡面板数据中个体分类变量(职业)状态变化识别问题求助

解决非平衡面板数据中个体变量变化标记的报错问题

报错原因

你使用的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:15:38