如何在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
相关产品推荐
相关产品推荐

