Python 如何计算数据帧中列值更改的频率
我有一个熊猫数据框,如下所示:Python 如何计算数据帧中列值更改的频率,python,pandas,Python,Pandas,我有一个熊猫数据框,如下所示: id some_value 0 tag1 v1 1 tag1 v2 2 tag1 v1 3 tag2 v2 4 tag2 v2 5 tag2 v3 import pandas as pd df = pd.DataFrame({'id': ['tag1', 'tag1', 'tag1', 'tag2', 'tag2','tag2'], 'some_value': ['v1','v2','v1',
id some_value
0 tag1 v1
1 tag1 v2
2 tag1 v1
3 tag2 v2
4 tag2 v2
5 tag2 v3
import pandas as pd
df = pd.DataFrame({'id': ['tag1', 'tag1', 'tag1', 'tag2', 'tag2','tag2'], 'some_value': ['v1','v2','v1','v2','v2','v3']})
mask = df['id'] == df['id'].shift(-1)
df['changed'] = df['some_value'] != df['some_value'].shift(-1)
df[mask].groupby('id').sum()
我想知道对于每个id,some\u value
中的值更改的频率。因此,对于tag1
,这将是两次(因为它首先从v1
变为v2
,然后再变回来),对于tag2
这将是一次。我已经解决了这样的问题:
id some_value
0 tag1 v1
1 tag1 v2
2 tag1 v1
3 tag2 v2
4 tag2 v2
5 tag2 v3
import pandas as pd
df = pd.DataFrame({'id': ['tag1', 'tag1', 'tag1', 'tag2', 'tag2','tag2'], 'some_value': ['v1','v2','v1','v2','v2','v3']})
mask = df['id'] == df['id'].shift(-1)
df['changed'] = df['some_value'] != df['some_value'].shift(-1)
df[mask].groupby('id').sum()
代码运行良好,因为它返回
changed
id
tag1 2.0
tag2 1.0
有没有更优雅的解决方案?实现这一点的一种方法是:
def numChanges(x):
return sum(x.iloc[:-1] != x.shift(-1).iloc[:-1])
df.groupby('id').agg({
'some_value' : numChanges
})
请注意,如果id列未排序,结果将不同,因此您的解决方案可能会产生不正确的结果,除非您打算这样做
例如,下面的数据集将使用我的解决方案生成tag2值为5,但根据您的解决方案生成3。从技术上讲,正确答案应该是5,但如果您的id变量被排序,则不会有任何区别
pd.concat([df]*3) #My solution outputs 5 changes for tag2 and yours will give 3 only
这个问题更适合多谢,特别是指出订购问题。