如何计算组中值的未更改出现次数

2024-04-26 08:10:44 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个DataFrame如下:

import pandas as pd
import numpy as np

df = pd.DataFrame.from_dict({'measurement_id': np.repeat([1, 2], [30, 30]),
                             'min': np.concatenate([np.repeat([1, 2, 3, 4, 5], [6, 6, 6, 6, 6]), 
                                                    np.repeat([1, 2, 3, 4, 5], [6, 6, 6, 6, 6])]),
                             'obj': list('ABCDEF' * 10),
                             'var': [1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1, 2, 2, 2, 2,
                                     1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2,                                                           
                                     2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2,
                                     2, 1, 1, 1, 2, 1]})

因此,有两个测量值在一分钟内测量6个对象的var值。我想做的是创建一个列来计算每个var值保持不变的时间(多少分钟)。我认为可以通过适当的groupby来实现,相当于R函数data.table::rleid,它创建运行长度类型id列,并最终计算结果列的一个值内的分钟数。你知道吗

因此,结果输出如下:

df['rleid_output'] = np.concatenate([[1] * 18, [2] * 12, [3] * 6, [4] * 18, [5] * 6])
df['expected_output'] = np.concatenate([[3] * 18, [2] * 12, [1] * 6, [3] * 18, [1] * 6])

不幸的是,我不知道怎样才能在熊猫身上做到。我既在努力创建rleid等价物,也在努力获得expected_output。无论是否使用rleid等价物,expected_output如何实现?你知道吗

@Edit:要回答关于“预期输出”逻辑的评论,我是这样计算的:

  • 对于第一次测量中的第一分钟,我们有以下成对的objvar:(A,1),(B,1),(C,2),(D,2),(E,2),(F,2)
  • 在第2和第3分钟的测量1中,这些对保持不变,因此第一次分配至少持续3分钟
  • 在第4分钟var值更改为1,表示obj = C。至少有一对已更改,因此整个赋值被视为已更改并开始新的值rleid_output。同时,我们已经知道上一个赋值持续了整整3分钟,对于前面的所有行,expected_output的值应该设置为3。当前赋值(objvar)是(A,1),(B,1),(C,1),(D,2),(E,2),(F,2)。你知道吗
  • 在第5分钟,任务没有改变。下一组(measurement_idmin)实际上是新的度量值,因此这是我们的最后一分钟,我们已经知道,我们应该将expected_output设置为2行,其中(measurement_id, min) == (1, 4)(measurement_id, min) == (1, 5)的赋值在2分钟内是相同的。你知道吗
  • 下一组行是新的度量值(measurement_id, min) == (2, 1)。它从赋值(A,2)、(B,2)、(C,1)、(D,1)、(E,2)、(F,2)开始。它在下一分钟发生变化,因此我们可以将其标记为只持续1分钟的赋值(值为expected_output)。你知道吗
  • 下一个赋值是(A,2),(B,1),(C,1),(D,1),(E,2),(F,2),它持续3分钟-这就是为什么expected_output = 3对于36到53行。你知道吗
  • 在测量2的最后5分钟,F将var值更改为2,因此我们有了新的赋值((A,2),(B,1),(C,1),(D,1),(E,2),(F,1)),它只持续1分钟,因为我们没有进一步的测量。你知道吗

我希望现在更清楚了。你知道吗

另外,如果我们不把作业作为一个整体来对待,而是把一对单独的作业来对待,例如(a,2),那么知道如何处理个别作业的变化也是很好的

@Edit2:shorted example,按要求如下:

df = pd.DataFrame.from_dict({'measurement_id': np.repeat([1, 2], [6, 6]),
                         'min': np.concatenate([np.repeat([1, 2, 3], [2, 2, 2]), 
                                                np.repeat([1, 2, 3], [2, 2, 2])]),
                         'obj': list('AB' * 6),
                         'var': [1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 1]})
df['rleid_output'] = [1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4]
df['expected_output'] = [2, 2, 2, 2, 1, 1, 2, 2, 2, 2, 1, 1]

Tags: idobjdataframedfoutputvarnpmin