gpt4 book ai didi

python - 删除连续的重复项。离开中间

转载 作者:行者123 更新时间:2023-12-03 18:36:13 25 4
gpt4 key购买 nike

这是我的数据帧:

                 dt    value
2000-01-01 00:00:00 296.0
2000-01-01 00:05:00 296.0
2000-01-01 00:10:00 296.0
2000-01-01 00:15:00 296.25
2000-01-01 00:20:00 296.25
2000-01-01 00:25:00 296.25
2000-01-01 00:30:00 296.25
2000-01-01 00:35:00 296.25
2000-01-01 00:40:00 296.25
2000-01-01 00:45:00 296.5
2000-01-01 00:50:00 296.5
2000-01-01 00:55:00 296.5
2000-01-01 01:00:00 296.5
2000-01-01 01:05:00 296.5
2000-01-01 01:10:00 296.5
2000-01-01 01:15:00 296.75
2000-01-01 01:20:00 296.75
2000-01-01 01:50:00 297.0
2000-01-01 01:55:00 297.0
2000-01-01 02:00:00 297.0
2000-01-01 02:05:00 297.0
2000-01-01 02:10:00 297.0
2000-01-01 02:15:00 297.0
我想删除相邻的重复项。
中间的副本应该保留。如果重复的数量是偶数,则从中间取下一个。如果有 2 个重复,请第二个。
预期输出:
                 dt    value
2000-01-01 00:05:00 296.0
2000-01-01 00:30:00 296.25
2000-01-01 01:00:00 296.5
2000-01-01 01:20:00 296.75
2000-01-01 02:05:00 297.0
我读了这篇关于重复的帖子,但它不满足我选择中间元素的条件。
Pandas: Drop consecutive duplicates

最佳答案

为了避免较慢的 groupby + apply(lambda ...),我们可以改用 cython 中实现的内置方法。根据 shift ed 系列检查连续值组,然后使用 sizecumcount 聚合这些组以对原始数据帧进行子集化。 (奖励:这会保留原始 DataFrame 索引)

gp = df['value'].ne(df['value'].shift()).cumsum()
gp = gp.groupby(gp)

df[gp.transform('size')//2 == gp.cumcount()]
                     dt   value
1 2000-01-01 00:05:00 296.00
6 2000-01-01 00:30:00 296.25
12 2000-01-01 01:00:00 296.50
16 2000-01-01 01:20:00 296.75
20 2000-01-01 02:05:00 297.00

为了说明相对性能,这里有一个例子。我创建了一个测试 DataFrame,其中每个值重复两次(只是为了简单起见),我们可以看到这两种方法如何随着时间的推移作为组数的函数进行缩放(这是 groupby + apply 缩放的重要数字)。
import perfplot
import pandas as pd
import numpy as np

def groupby_apply(df):
gp = df['value'].ne(df['value'].shift()).cumsum()
return df.groupby(gp).apply(lambda x: x.iloc[len(x) // 2])

def groupby_builtin(df):
gp = df['value'].ne(df['value'].shift()).cumsum()
gp = gp.groupby(gp)

return df[gp.transform('size')//2 == gp.cumcount()]

perfplot.show(
setup=lambda N: pd.DataFrame({'dt': range(N),
'value': np.repeat(np.arange(N//2), 2)}),

kernels=[
lambda df: groupby_apply(df),
lambda df: groupby_builtin(df)],

labels=['apply', 'built-in'],
n_range=[2 ** k for k in range(1, 20)],
equality_check=np.allclose,
xlabel='Proxy for # of Groups'
)
enter image description here

关于python - 删除连续的重复项。离开中间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65584129/

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