如何将非重叠数据帧矢量化为重叠移位数据帧?

帕特里克·李

我想将常规数据框转换为具有重叠和移位的多索引数据框。

例如,输入数据框类似于以下示例代码:

import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.arange(0, 12).reshape(-1, 2), columns=['d1', 'd2'], dtype=float)
df.index.name = 'idx'
print(df)

输出:

       d1    d2
idx            
0     0.0   1.0
1     2.0   3.0
2     4.0   5.0
3     6.0   7.0
4     8.0   9.0
5    10.0  11.0

我要输出的是:使其按批次重叠,并且每次移位一行(添加一列batchid以标记每次移位),如下所示(batchsize = 4):

               d1    d2
idx batchid            
0   0         0.0   1.0
1   0         2.0   3.0
2   0         4.0   5.0
3   0         6.0   7.0
1   1         2.0   3.0
2   1         4.0   5.0
3   1         6.0   7.0
4   1         8.0   9.0
2   2         4.0   5.0
3   2         6.0   7.0
4   2         8.0   9.0
5   2        10.0  11.0

到目前为止,我的工作是:我可以使其与迭代一起使用,并将它们结合在一起。但这会花费很多时间。

batchsize = 4
ds, ids = [], []
idx = df.index.values
for bi in range(int(len(df) - batchsize + 1)):
    ids.append(idx[bi:bi+batchsize])
for k, idx in enumerate(ids):
    di = df.loc[pd.IndexSlice[idx], :].copy()
    di['batchid'] = k
    ds.append(di)
res = pd.concat(ds).fillna(0)
res.set_index('batchid', inplace=True, append=True)

有没有办法向量化和加速这个过程?

谢谢。

皮特巴格

首先,我们创建一个“掩码”,该掩码将告诉我们哪些元素进入哪个批次ID

nrows = len(df)
batchsize = 4
mask_columns = {i:np.pad([1]*batchsize,(i,nrows-batchsize-i)) for i in range(nrows-batchsize+1)}
mask_df = pd.DataFrame(mask_columns)
df = df.join(mask_df)

这会向df添加几列:


  idx    d1    d2    0    1    2
-----  ----  ----  ---  ---  ---
    0     0     1    1    0    0
    1     2     3    1    1    0
    2     4     5    1    1    1
    3     6     7    1    1    1
    4     8     9    0    1    1
    5    10    11    0    0    1

现在看起来像是带有“假人”的df,我们需要“逆转”假人:

df2 = df.set_index(['d1','d2'], drop=True)
df2[df2==1].stack().reset_index().drop(0,1).sort_values('level_2').rename(columns = {'level_2':'batchid'})

产生

      d1    d2    batchid
--  ----  ----  ---------
 0     0     1          0
 1     2     3          0
 3     4     5          0
 6     6     7          0
 2     2     3          1
 4     4     5          1
 7     6     7          1
 9     8     9          1
 5     4     5          2
 8     6     7          2
10     8     9          2
11    10    11          2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

矢量化数据帧创建?

将数据帧划分为重叠段

用于多数据帧操作的 Pandas 矢量化

添加多个重叠多维数据集的矢量化方法

如何根据另一个数据帧中的行条件对一个数据帧的行索引进行矢量化查找

用于数据帧中多列操作的矢量化解决方案

熊猫使用两个数据帧之间的条件语句进行计数的矢量化方法

矢量化操作以根据 Python 中数据帧中的不同条件创建多个新列

熊猫:具有两个数据帧功能的矢量化

通过多个if-else子句对熊猫数据帧进行矢量化以拆分域

组合两个不同数据帧的矢量化 for 循环

对数据帧中的行子集使用Apply函数-矢量化解决方案

R在数据帧内矢量化的字符串中提取模式

在 Pandas 中使用矢量化计算值并将结果插入到数据帧中

熊猫矢量化而不是两个数据帧的循环

将数据帧拆分为多个,并重叠行

将重叠间隔列表拆分为 pyspark 数据帧中的非重叠子间隔,并检查值在重叠间隔上是否有效

如何基于*部分*行重叠合并数据帧?

在 R 中查找数据帧范围的重叠

单个数据帧中的重叠范围

r中数据帧中的重叠间隔

基于时间戳间隔重叠的数据帧

如何将字典的数据帧转换为数据帧?

如何将数据帧缩放到更大的数据帧?

在具有重复索引的数据帧之间进行矢量化计算时,Pandas 保持索引顺序

R将自定义矢量化函数应用于数据帧中的行,特定列

对大型2D数据帧进行矢量化处理,以提高optimx L-BFGS-B的效率

有没有办法对当前在 Pandas 数据帧中的行进行迭代的代码进行矢量化?

如何将行附加到 Pandas 数据帧,并将多个重叠单元格(具有相同索引)转换为单个值,而不是一个系列?