我正在处理列中包含字符串的数据集,我需要计算该列的数据框中的更改数。因此,如果数据框按列'id'分组,则一个组实例将如下所示:
id vehicle
'abc' 'bmw'
'abc' 'bmw'
'abc' 'yamaha'
'abc' 'suzuki'
'abc' 'suzuki'
'abc' 'kawasaki'
所以在这种情况下,我希望能够说id'abc'改变车辆品牌3次。是否有一种有效的方法可以在列'id'的多个组中执行此操作?
答案 0 :(得分:2)
我可以想到两种方式:
1)在{id'上groupby
并在“车辆”列上调用apply
并传递方法nunique
,您必须减去1,因为您正在寻找更改而不仅仅是总体独特的数量:
In [292]:
df.groupby('id')['vehicle'].nunique() -1
Out[292]:
id
'abc' 3
Name: vehicle, dtype: int64
2)apply
一个lambda,用于测试当前车辆是否与使用shift
的先前车辆不相等,这在语义上更正确,因为它检测到更改而不仅仅是整体唯一计数,调用{关于布尔值的{3}}会将True
和False
分别转换为1
和0
:
In [293]:
df.groupby('id')['vehicle'].apply(lambda x: x != x.shift()).sum() - 1
Out[293]:
3
上面需要-1
,因为它将与不存在的行进行比较的第一行与NaN
的比较在这种情况下没有意义,请参阅下文:< / p>
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