使用Pandas在数据框列上进行滑动窗口操作

4

我是pandas的新手。我正在使用pandas读取一个包含时间戳记录的CSV文件,并将其读入数据框中。该数据具有以下列:

时间戳 COLUMN_A COLUMN_B COLUMN_C

将数据读入数据框后,我想能够在COLUMN_C上运行窗口函数;该函数应返回列的时间戳值。

我已经为可迭代对象编写了一些代码:

import collections
import itertools


def sliding_window_iter(iterable, size):
    """Iterate through iterable using a sliding window of several elements.

    Creates an iterable where each element is a tuple of `size`
    consecutive elements from `iterable`, advancing by 1 element each
    time. For example:

    >>> list(sliding_window_iter([1, 2, 3, 4], 2))
    [(1, 2), (2, 3), (3, 4)]
    """
    iterable = iter(iterable)
    window = collections.deque(
        itertools.islice(iterable, size-1),
        maxlen=size
    )
    for item in iterable:
        window.append(item)
        yield tuple(window)

我该如何修改这个操作,使它能够在数据框的列上工作呢?


Pandas内置了一系列相当全面的窗口函数,请检查是否已经包含您所需的函数。链接 - G. Anderson
这回答了你的问题吗?使用iterrows在pandas dataframe中选择接下来的N行。你仍然需要生成每个连续切片的边界。 - aneroid
仅需要列值吗?还是操作需要索引? - wwii
1个回答

5

逐步切片数据框更为简单。 因为您想要重叠的窗口[(1, 2), (2, 3), (3, 4), ...],您可以这样编写:

def sliding_window_iter(series, size):
    """series is a column of a dataframe"""
    for start_row in range(len(series) - size + 1):
        yield series[start_row:start_row + size]

使用方法:

df = pd.DataFrame({'A': list(range(100, 501, 100)),
                   'B': list(range(-20, -15)),
                   'C': [0, 1, 2, None, 4]},
                  index=pd.date_range('2021-01-01', periods=5))

list(sliding_window_iter(df['C'], 2))

输出:

[2021-01-01    0.0
 2021-01-02    1.0
 Freq: D, Name: C, dtype: float64,
 2021-01-02    1.0
 2021-01-03    2.0
 Freq: D, Name: C, dtype: float64,
 2021-01-03    2.0
 2021-01-04    NaN
 Freq: D, Name: C, dtype: float64,
 2021-01-04    NaN
 2021-01-05    4.0
 Freq: D, Name: C, dtype: float64]

如果传入多列也可以正常工作:

list(sliding_window_iter(df.loc[:, ['A', 'C']], 2))

#output:
[              A    C
 2021-01-01  100  0.0
 2021-01-02  200  1.0,
               A    C
 2021-01-02  200  1.0
 2021-01-03  300  2.0,
               A    C
 2021-01-03  300  2.0
 2021-01-04  400  NaN,
               A    C
 2021-01-04  400  NaN
 2021-01-05  500  4.0]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接