我在Python中得到了以下数据帧:
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]})
首先,在由object
定义的每个组中,我想将id分配给measurement_id
和var
列的唯一运行。如果这些列的任何值发生更改,它将启动新的运行,该运行应被分配新的id
df['rleid_output'] = [1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 3]
然后,对于rleid_output
定义的每个组,我想检查运行持续了多少分钟(min
列),并给出expected_output
列:
df['expected_output'] = [2, 2, 2, 2, 1, 1, 2, 3, 2, 3, 1, 3]
如果是R,我会按以下步骤进行:
df <- data.frame(measurement_id = rep(1:2, each = 6),
min = rep(rep(1:3, each = 2), 2),
object = rep(LETTERS[1:2], 6),
var = c(1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 1))
df %>%
group_by(object) %>%
mutate(rleid = data.table::rleid(measurement_id, var)) %>%
group_by(object, rleid) %>%
mutate(expected_output = last(min) - first(min) + 1)
因此,我需要的主要内容是使用Pythonpd.DataFrame.groupby
子句的Rdata.table::rleid
等价物。有什么办法解决这个问题吗?你知道吗
@Edit:new,更新的数据帧示例:
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, 2, 2, 1, 1, 2, 1, 2, 1, 1, 1]})
df['rleid_output'] = [1, 1, 2, 1, 3, 2, 4, 3, 4, 3, 5, 3]
df['expected_output'] = [1, 2, 1, 2, 1, 1, 2, 3, 2, 3, 1, 3]
为了模拟R
rleid
函数的行为,可以首先创建一个人工列,检查当前值与前一个值相比是否发生了变化。在这种情况下,我们应该对分组的var
系列执行此操作:然后,我们可以使用这个人工的
tmp
列来获得rleid_output2
。之后,不再需要tmp
列。你知道吗最后,为了检查
var
值持续了多少分钟,我们可以计算组中最后一分钟和第一分钟之间的差异。你知道吗.iat
与.iloc
类似,但允许我们访问DataFrame
或Series
中的单个值。你知道吗更新答案
问题是每个
measurement_id, obj, var
组中的min
列应该保持顺序。我们可以通过分组检查measurement_id, obj, var
,然后检查min
列中的差异是否大于1
。如果是这样,我们在expected_output
中将其标记为唯一的持续时间:旧答案,遵循OP的逻辑
我们可以通过使用
GroupBy.diff
来获得您的rleid_output
,这基本上是每次var
为每个measurement_id
&;obj
更改时的唯一标识符之后使用
GroupBy.nunique
来测量minutes
的量:相关问题 更多 >
编程相关推荐