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

如何在Pandas DataFrame中标记同一地址ID下的运营商变更?

解决方法

我们需要按address_id分组,对比同组内每行的business与前一行是否不同,以此标记业务变更的行。

步骤1:计算同组内的业务变更情况

通过groupby按address_id分组,用shift()获取同组前一行的business值,再对比当前行与前一行是否存在差异:

df['is_changed'] = df.groupby('address_id')['business'].apply(lambda x: x != x.shift())

步骤2:处理每组第一行的空值

每组第一行没有前一行数据,shift()会返回NaN,对比结果也是NaN,我们将这些值设为False(因为第一行不存在变更):

df['is_changed'] = df['is_changed'].fillna(False)

完整代码

import pandas as pd
import numpy as np

details = {
    'address_id': [1, 1, 1, 2, 2],
    'business': ['verizon', 'verizon', 'comcast', 'sprint', 'att']
}
 
df = pd.DataFrame(details)

# 标记变更行
df['is_changed'] = df.groupby('address_id')['business'].apply(lambda x: x != x.shift())
df['is_changed'] = df['is_changed'].fillna(False)

print(df)

运行结果

address_id  business  is_changed
0           1   verizon       False
1           1   verizon       False
2           1    comcast        True
3           2    sprint       False
4           2       att        True

原代码失效原因

  • 使用了错误的列名Column1和Column2,实际列名为address_id和business
  • isin()方法用于判断值是否属于某个集合,不适合用来对比同组前后行的业务变化,逻辑方向错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 14:06:39