gpt4 book ai didi

python - 如何计算 pandas 数据框中一系列单元格中 2 个值以内的单元格?

转载 作者:行者123 更新时间:2023-12-05 03:16:23 25 4
gpt4 key购买 nike

我有一个看起来像这样的数据框:

    col1
0 10
1 5
2 8
3 12
4 13
5 6
6 9
7 11
8 10
9 3
10 21
11 18
12 14
13 16
14 30
15 45
16 31
17 40
18 38

对于“col1”中的每个单元格,我计算一个值的范围:

df['df_min'] = df.col1 - df.col1 * 0.2
df['df_max'] = df.col1 + df.col1 * 0.2

对于每个单元格都有一个范围,我想计算过去 xx 个单元格(本例中为 3 个)中“col1”中有多少个单元格在该范围内,但没有循环,因为它需要很长时间我的实际模型。

我正在努力实现这个结果:

    col1  df_min  df_max  counter
0 10 8.0 12.0 -1
1 5 4.0 6.0 -1
2 8 6.4 9.6 -1
3 12 9.6 14.4 1
4 13 10.4 15.6 1
5 6 4.8 7.2 0
6 9 7.2 10.8 0
7 11 8.8 13.2 2
8 10 8.0 12.0 2
9 3 2.4 3.6 0
10 21 16.8 25.2 0
11 18 14.4 21.6 1
12 14 11.2 16.8 0
13 16 12.8 19.2 2
14 30 24.0 36.0 0
15 45 36.0 54.0 0
16 31 24.8 37.2 1
17 40 32.0 48.0 1
18 38 30.4 45.6 3

这是我可以想出的(困惑的)代码,但如果可能的话,我真的想要一个更快的解决方案。任何帮助将不胜感激。

df = pd.DataFrame({"col1":[10, 5, 8, 12, 13, 6, 9, 11, 10, 3, 21, 18, 14, 16, 30, 45, 31, 40, 38]})

back = 3 # numbers of cells to check back

df['df_min'] = df.col1 - df.col1 * 0.2
df['df_max'] = df.col1 + df.col1 * 0.2

l = []
for window in df.col1.rolling(window=back+1, center=False, closed='right'):
if window.empty:
pass
else:
a = window.iloc[-1]
range_min = a - a * 0.2
range_max = a + a * 0.2
c = 0
if len(window) == back+1:
for b in window:
if (b >= range_min and b <= range_max):
c += 1
c = c-1 # substract 1 because window includes the tested value which is always true
l.append(c)
df1 = pd.DataFrame(l, columns=['counter'])

df = df.join(df1)

print(df)

最佳答案

使用向量化操作循环

代码

df['df_min'] = df.col1 - df.col1 * 0.2
df['df_max'] = df.col1 + df.col1 * 0.2
n = 3
s = pd.Series(dtype='float')
for i in range(0, n):
s1 = df.col1.shift(i+1).ge(df['df_min']) & df.col1.shift(i+1).le(df['df_max'])
s = s.add(s1, fill_value=0)
s[:n] = -1
df['counter'] = s

输出(df):

    col1    df_min  df_max  counter
0 10 8.0 12.0 -1.0
1 5 4.0 6.0 -1.0
2 8 6.4 9.6 -1.0
3 12 9.6 14.4 1.0
4 13 10.4 15.6 1.0
5 6 4.8 7.2 0.0
6 9 7.2 10.8 0.0
7 11 8.8 13.2 2.0
8 10 8.0 12.0 2.0
9 3 2.4 3.6 0.0
10 21 16.8 25.2 0.0
11 18 14.4 21.6 1.0
12 14 11.2 16.8 0.0
13 16 12.8 19.2 2.0
14 30 24.0 36.0 0.0
15 45 36.0 54.0 0.0
16 31 24.8 37.2 1.0
17 40 32.0 48.0 1.0
18 38 30.4 45.6 3.0



我不知道你的数据集。然而,当我用 1,000,000 行和 n = 10 进行测试时,这段代码只需要 0.4 秒。


测试示例

import numpy as np
df = pd.DataFrame(np.random.randint(20,100, 1000000), columns=['col1'])

关于python - 如何计算 pandas 数据框中一系列单元格中 2 个值以内的单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74673689/

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