gpt4 book ai didi

python - Pandas:如何在滚动窗口中选择一列

转载 作者:行者123 更新时间:2023-12-02 08:09:21 26 4
gpt4 key购买 nike

我有一个数据框(包含“a”、“b”、“c”列),我正在其中执行滚动窗口。

我希望能够使用应用函数中的一列(例如“a”)来过滤滚动窗口,如下所示

df.rolling(len(s),min_periods=0).apply(lambda x: x[[x['a']>10][0] if len(x[[x['a']>10]]) >=0 else np.nan)

上面这行的目的是选择滚动窗口中'a'列值大于10的第一行。如果没有这样的行,则返回nan。

但我无法这样做并收到以下错误

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

这意味着我根本不允许通过此语法访问各个列。还有其他方法可以做这种事情吗?

最佳答案

您的错误源于假设 apply 内的函数是一个数据帧,它实际上是一个 ndarray 而不是数据帧。

Pandas dataframe apply 适用于数据帧的每个列/系列,因此传递给 apply 的任何函数都会像内部 lambda 一样沿着每个列/系列应用。对于窗口数据帧,apply 获取每个窗口内的每一列/系列,并将其作为 ndarray 传递给函数,并且该函数必须仅返回每个窗口的每个系列的长度为 1 的数组。知道这一点可以减轻很多痛苦。

因此,在您的情况下,您不能使用任何 apply ,除非您有一个复杂的函数来记住每个窗口的系列 a 的第一个值。

对于OP的情况,如果窗口的一列a满足条件,则说> 10

  1. 对于窗口第一行中的 a 满足条件的情况,与在数据帧中搜索 df[df['a']>10]

  2. 对于其他条件,例如窗口第二行中的 a> 10,检查除数据帧的第一个窗口之外的整个数据帧都有效。

以下示例演示了另一种解决方法。

import numpy as np
import pandas as pd
np.random.seed(123)
df = pd.DataFrame(np.random.randint(0,20,size=(20, 4)), columns=list('abcd'))

df 看起来像

    a   b   b   d
0 13 2 2 6
1 17 19 10 1
2 0 17 15 9
3 0 14 0 15
4 19 14 4 0
5 16 4 17 3
6 2 7 2 15
7 16 7 9 3
8 6 1 2 1
9 12 8 3 10
10 5 0 11 2
11 10 13 18 4
12 15 11 12 6
13 13 19 16 6
14 14 7 11 7
15 1 11 5 18
16 17 12 18 17
17 1 19 12 9
18 16 17 3 3
19 11 7 9 2

现在,如果 a 的滚动窗口内的第二行满足条件 a > 10 (如 OP 的问题中所示),则选择一个窗口。

roll_window=5
search_index=1

df_roll = df['a'].rolling(roll_window)
df_y = df_roll.apply(lambda x:x[1] if x[1] > 10 else np.nan).dropna()

上面的行返回大于 10 的窗口第二行中与条件 a 相对应的 a 的所有值。请注意,这些值基于上面的示例数据帧是正确的,但索引由滚动窗口的居中方式定义。

4     17.0
7 19.0
8 16.0
10 16.0
12 12.0
15 15.0
16 13.0
17 14.0
19 17.0

获取第一个数据帧内的正确索引位置和整行

df.loc[df_y.index+searchindex-rollwindow+1]

返回

    a   b   b   d
1 17 19 10 1
4 19 14 4 0
5 16 4 17 3
7 16 7 9 3
9 12 8 3 10
12 15 11 12 6
13 13 19 16 6
14 14 7 11 7
16 17 12 18 17

还可以使用np.array(df)并制作与滚动窗口相对应的滚动切片,并相应地使用切片过滤数组。

关于python - Pandas:如何在滚动窗口中选择一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44674159/

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