假设我有一个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:要回答关于“预期输出”逻辑的评论,我是这样计算的:
obj
和var
:(A,1),(B,1),(C,2),(D,2),(E,2),(F,2)var
值更改为1,表示obj = C
。至少有一对已更改,因此整个赋值被视为已更改并开始新的值rleid_output
。同时,我们已经知道上一个赋值持续了整整3分钟,对于前面的所有行,expected_output
的值应该设置为3。当前赋值(obj
,var
)是(A,1),(B,1),(C,1),(D,2),(E,2),(F,2)。你知道吗measurement_id
,min
)实际上是新的度量值,因此这是我们的最后一分钟,我们已经知道,我们应该将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
)。你知道吗expected_output = 3
对于36到53行。你知道吗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]
目前没有回答
相关问题 更多 >
编程相关推荐