Python 计算行元素中的更改

Python 计算行元素中的更改,python,pandas,Python,Pandas,我正在处理一个列中包含字符串的数据集,我需要计算该列的数据帧中的更改数量。因此,如果数据帧按列“id”分组,则一个组实例如下所示: id vehicle 'abc' 'bmw' 'abc' 'bmw' 'abc' 'yamaha' 'abc' 'suzuki' 'abc' 'suzuki' 'abc' 'kawasaki' 所以在这种情况下,我想说的是,id‘abc’改变了汽车品牌3次。有没有一种有效的方法可以对列“id”的多个组执

我正在处理一个列中包含字符串的数据集,我需要计算该列的数据帧中的更改数量。因此,如果数据帧按列“id”分组,则一个组实例如下所示:

    id    vehicle
   'abc'  'bmw'
   'abc'  'bmw'
   'abc'  'yamaha'
   'abc'  'suzuki'
   'abc'  'suzuki'
   'abc'  'kawasaki'
所以在这种情况下,我想说的是,id‘abc’改变了汽车品牌3次。有没有一种有效的方法可以对列“id”的多个组执行此操作?

我可以想出两种方法:

1) 在“id”上并调用“vehicle”列和pass method
nunique
,在查找更改时,您必须减去1,而不仅仅是一个整体唯一计数:

In [292]:
df.groupby('id')['vehicle'].nunique() -1

Out[292]:
id
'abc'    3
Name: vehicle, dtype: int64
2) 一个lambda测试当前车辆是否与前一辆使用的车辆不相等,这在语义上更为正确,因为它检测的是变化,而不仅仅是整体唯一计数,调用布尔值将分别将
True
False
转换为
1
0

In [293]:
df.groupby('id')['vehicle'].apply(lambda x: x != x.shift()).sum() - 1

Out[293]:
3
上面需要
-1
,因为第一行将与不存在的行进行比较,在这种情况下,与
NaN
进行比较没有意义,请参见下文:

In [301]:
df.groupby('id')['vehicle'].apply(lambda x: x != x.shift())

Out[301]:
0     True
1    False
2     True
3     True
4    False
5     True
Name: 'abc', dtype: bool

访问每个id的
车辆
,并将列表传递到
set()
您将获得给定id的不同车辆。这并不能满足我的要求。我不需要唯一的值。我需要他们改变的次数。唯一值为4,但变化为3。只需对给定id的车辆进行迭代,如果下一个值不等于当前值,则增加一个变量,您到底面临着什么问题?这是一个极其简化的示例。实际数据集有一百万行和数百个组(按id)。循环需要很长时间,这很有效。我知道必须使用lambda,只是没有想到使用移位函数。非常感谢。