Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何计算数据帧中列值更改的频率_Python_Pandas - Fatal编程技术网

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

这个问题更适合多谢,特别是指出订购问题。