gpt4 book ai didi

python - 根据 n 个连续条目替换列中的值

转载 作者:行者123 更新时间:2023-12-01 19:30:04 24 4
gpt4 key购买 nike

我有一列数据,其值范围为 0、1 和 2。如果 1 和 2 的所有实例在 n 行中不持续出现,我想将这些实例替换为 0 值。如果这些值持续存在,对于 n 行,我想将它们保留原样。示例,其中 n=4:

df = pd.DataFrame({'data': [1,0,1,2,0,0,0,1,0,2,2,2,2,2,2,0,1,0,1,0,2],
'desired': [0,0,0,0,0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0,0]})

data desired
0 1 0
1 0 0
2 1 0
3 2 0
4 0 0
5 0 0
6 0 0
7 1 0
8 0 0
9 2 2
10 2 2
11 2 2
12 2 2
13 2 2
14 2 2
15 0 0
16 1 0
17 0 0
18 1 0
19 0 0
20 2 0

预期的功能本质上是“过滤”基础数据以获取值的短暂变化。我希望能够声明允许保留基础数据所需的连续值的数量,包括低于和高于“n”的所有值。 (如果 n = 4 并且有 6 个连续值,我想要所有 6 个值,而不仅仅是持续超出 4 截止值的 2 个值。)。 Pandas 有矢量化的方法吗?

最佳答案

使用差异cumsum,然后得到每个组的大小:

n = 4 
groups = df['data'].diff().ne(0).cumsum()
df['desired'] = df['data'].where(df.groupby(groups)['data'].transform('size').gt(n), other=0)

data desired
0 1 0
1 0 0
2 1 0
3 2 0
4 0 0
5 0 0
6 0 0
7 1 0
8 0 0
9 2 2
10 2 2
11 2 2
12 2 2
13 2 2
14 2 2
15 0 0
16 1 0
17 0 0
18 1 0
19 0 0
20 2 0
<小时/>

时间:

# create sample dataframe of 1 million rows
df = pd.DataFrame({'data': [1,0,1,2,0,0,0,1,0,2,2,2,2,2,2,0,1,0,1,0,2]})
dfbig = pd.concat([df]*50000, ignore_index=True)
dfbig.shape

(1050000, 1)

二凡

%%timeit
n = 4

groups = dfbig['data'].diff().ne(0).cumsum()
dfbig['data'].where(dfbig.groupby(groups)['data'].transform('size').gt(4), other=0)

268 ms ± 15.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

光黄

%%timeit
n=4
s = dfbig['data'].diff().eq(0).rolling(n-1).sum()

# fill
np.where(s.where(s>=n-1).bfill(limit=n-1).notnull(), dfbig['data'], 0)

164 ms ± 3.8 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

piRSquared

%%timeit
a = dfbig.data.to_numpy()
b = np.append(0, a[:-1] != a[1:]).cumsum()

dfbig.data.where(np.bincount(b)[b] >= 4, 0)

62 ms ± 735 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
<小时/>

结论:

  1. piRSquared
  2. 黄光
  3. 二凡

关于python - 根据 n 个连续条目替换列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59723736/

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