确定分组数据框中值的变化

2023-11-29

假设有一个像这样的数据集(最初是从 .csv 读取的):

data = pd.DataFrame({'id': [1,2,3,1,2,3],
                     'time':['2017-01-01 12:00:00','2017-01-01 12:00:00','2017-01-01 12:00:00',
                          '2017-01-01 12:10:00','2017-01-01 12:10:00','2017-01-01 12:10:00'],
                     'value': [10,11,12,10,12,13]})

=>

    id  time                    value
0   1   2017-01-01 12:00:00     10
1   2   2017-01-01 12:00:00     11
2   3   2017-01-01 12:00:00     12
3   1   2017-01-01 12:10:00     10
4   2   2017-01-01 12:10:00     12
5   3   2017-01-01 12:10:00     13

每个观察周期内所有 ID 的时间都是相同的。该系列以这种方式进行多次观察,即每十分钟一次。

我想要的总变化数value连续时间之间按 id 排列的列。例如:对于 id=1,没有变化(结果:0)。对于 id=2,有一项更改(结果:1)。 受这篇文章的启发,我尝试采取差异:确定 pandas 数据框中列值何时更改

这是我到目前为止所提出的(没有按预期工作):

data = data.set_index(['id', 'time']) # MultiIndex 
grouped = data.groupby(level='id') 
data['diff'] = grouped['value'].diff()
data.loc[data['diff'].notnull(), 'diff'] = 1
data.loc[data['diff'].isnull(), 'diff'] = 0
grouped['diff'].sum()

但是,这只是每个 id 出现次数的总和。

由于我的数据集很大(并且无法装入内存),因此解决方案应该尽可能快。 (这就是为什么我在 id + time 上使用 MultiIndex 的原因。我期望显着的加速,因为最佳情况下数据不再需要被打乱。)

此外,我遇到了 dask 数据帧,它与 pandas dfs 非常相似。利用它们的解决方案将是非常棒的。


你想要这样的东西吗?

data.groupby('id').value.apply(lambda x: len(set(x)) - 1)

You get

id
1    0
2    1
3    1

编辑:正如@COLDSPEED提到的,如果要求将更改捕获回某个值,请使用

data.groupby('id').value.apply(lambda x: (x != x.shift()).sum() - 1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

确定分组数据框中值的变化 的相关文章

随机推荐