Python 计算行元素中的更改
我正在处理一个列中包含字符串的数据集,我需要计算该列的数据帧中的更改数量。因此,如果数据帧按列“id”分组,则一个组实例如下所示: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 vehicle
'abc' 'bmw'
'abc' 'bmw'
'abc' 'yamaha'
'abc' 'suzuki'
'abc' 'suzuki'
'abc' 'kawasaki'
所以在这种情况下,我想说的是,id‘abc’改变了汽车品牌3次。有没有一种有效的方法可以对列“id”的多个组执行此操作?我可以想出两种方法:
1) 在“id”上并调用“vehicle”列和pass methodnunique
,在查找更改时,您必须减去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,只是没有想到使用移位函数。非常感谢。