在 Pandas 中将数据框列拆分为相等的窗口

Posted

技术标签:

【中文标题】在 Pandas 中将数据框列拆分为相等的窗口【英文标题】:Splitting dataframe column into equal windows in Pandas 【发布时间】:2017-12-31 09:39:36 【问题描述】:

我有一个如下所示的数据框,我打算用size = 30 提取窗口,然后为每个数据块编写for循环并调用其他函数。

index = pd.date_range(start='2016-01-01', end='2016-04-01', freq='D')
data = pd.DataFrame(np.random.rand(len(index)), index = index, columns=['random'])

我找到了以下功能,但我想知道是否有更有效的方法。

def split(df, chunkSize = 30): 
    listOfDf = list()
    numberChunks = len(df) // chunkSize + 1
    for i in range(numberChunks):
        listOfDf.append(df[i*chunkSize:(i+1)*chunkSize])
    return listOfDf 

【问题讨论】:

你能修正一下缩进吗? 【参考方案1】:

您可以使用列表推导。请参阅SO Post,了解如何访问 dfs 以及另一种分解数据帧的方法。

n = 200000  #chunk row size
list_df = [df[i:i+n] for i in range(0,df.shape[0],n)]

【讨论】:

一点补充信息:如果你的窗口没有均匀地划分你的数据集(即 len(df)%n > 0),最后一个窗口会更小。如果这会导致问题,@jdehesa 解决方案会在最后一个 (len(df)%n) 窗口上平均分配额外的数据点,这样每个窗口的长度都是 n 或 n-1(但当然需要使用 numpy)。 【参考方案2】:

您可以使用 NumPy 的 array_split 高效地做到这一点:

import numpy as np

def split(df, chunkSize = 30):
    numberChunks = len(df) // chunkSize + 1
    return np.array_split(df, numberChunks, axis=0)

即使它是一个 NumPy 函数,它也会返回具有正确索引和列的拆分数据帧。

【讨论】:

以上是关于在 Pandas 中将数据框列拆分为相等的窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何在 df.groupby 之后将数据框列值作为窗口大小传递?

我们如何在 C++ 中使用窗口拆分器

Pandas 有条件地创建系列/数据框列

在 Python 中将数据框列与可接受的偏差进行比较

使用 pandas 数据框列值来透视其他列

如何在QML中将RowLayout正确拆分为两个相等的字段?