gpt4 book ai didi

python - Python 中的 R group_by() + rleid() 等效项

转载 作者:行者123 更新时间:2023-12-02 19:44:42 28 4
gpt4 key购买 nike

我在 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_idvar 列。如果这些列的任何值发生变化,它将开始新的运行,并应分配新的 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)

所以我主要需要的是 R data.table::rleid 等效项,它可以与 Python pd.DataFrame.groupby 子句一起使用。有什么想法可以解决这个问题吗?

@Edit:新的、更新的数据框示例:

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]

最佳答案

更新答案

问题是每组measurement_id, obj, var中的min列应该保持顺序。我们可以通过 measurement_id, obj, var 进行分组检查,然后检查 min 列中的差异是否大于 1。如果是这样,我们将其标记为 expected_output 中的唯一持续时间:

df['grouper'] = (df.groupby(['measurement_id', 'obj', 'var'])['min']
.apply(lambda x: x.diff().fillna(1).eq(1))
)

df['expected_output'] = (
df.groupby(['measurement_id', 'obj', 'var'])['grouper'].transform('sum').astype(int)
)

df = df.drop(columns='grouper')

measurement_id min obj var expected_output
0 1 1 A 1 1
1 1 1 B 2 2
2 1 2 A 2 1
3 1 2 B 2 2
4 1 3 A 1 1
5 1 3 B 1 1
6 2 1 A 2 2
7 2 1 B 1 3
8 2 2 A 2 2
9 2 2 B 1 3
10 2 3 A 1 1
11 2 3 B 1 3

旧答案,遵循OP的逻辑

我们可以通过使用 GroupBy.diff 获取您的 rleid_output 来实现此目的,基本上每次 var 为每个 更改时都有一个唯一标识符>measurement_id& obj

之后使用GroupBy.nunique来测量分钟:

rleid_output = df.groupby(['measurement_id', 'obj'])['var'].diff().abs().bfill()
df['expected_output'] = (df.groupby(['measurement_id', 'obj', rleid_output])['min']
.transform('nunique'))

measurement_id min obj var expected_output
0 1 1 A 1 2
1 1 1 B 2 2
2 1 2 A 1 2
3 1 2 B 2 2
4 1 3 A 2 1
5 1 3 B 1 1
6 2 1 A 2 2
7 2 1 B 1 3
8 2 2 A 2 2
9 2 2 B 1 3
10 2 3 A 1 1
11 2 3 B 1 3

关于python - Python 中的 R group_by() + rleid() 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59501437/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com