gpt4 book ai didi

pandas - 如何对具有偏移量的向量应用操作

转载 作者:行者123 更新时间:2023-12-03 14:06:43 25 4
gpt4 key购买 nike

考虑以下 pd.DataFrame

import numpy as np
import pandas as pd

start_end = pd.DataFrame([[(0, 3), (4, 5), (6, 12)], [(7, 10), (11, 90), (91, 99)]])
values = np.random.rand(1, 99)
start_endpd.DataFrame形状 (X, Y)其中里面的每个值都是 (start_location, end_location) 的元组在 values向量。另一种说法是特定单元格中的值是不同长度的向量。
问题
如果我想找到 pd.DataFrame 中每个单元格的向量值的平均值(例如) ,我怎样才能以具有成本效益的方式做到这一点?
我设法通过 .apply 实现了这一目标功能,但速度很慢。
我想我需要找到某种方式将它呈现在 numpy 中数组,然后将其映射回 2d 数据框,但我不知道如何。
备注
  • 起点和终点之间的距离可能会有所不同,并且可能存在异常值。
  • 单元格开始/结束始终与其他单元格不重叠(看看这个先决条件是否影响求解速度会很有趣)。

  • 广义问题
    更一般地说,我这是一个反复出现的问题,即如何制作 3d 数组,其中一个维度的长度与通过某些转换函数(均值、最小值等)与 2d 矩阵的长度不相等。

    最佳答案

    前瞻性方法
    查看您的示例数据:

    In [64]: start_end
    Out[64]:
    0 1 2
    0 (1, 6) (4, 5) (6, 12)
    1 (7, 10) (11, 12) (13, 19)
    每行确实不重叠,但不是整个数据集。
    现在,我们有 np.ufunc.reduceat ,它为我们提供了每个切片的 ufunc 缩减:
    ufunc(ar[indices[i]: indices[i + 1]])
    只要 indices[i] < indices[i+1]
    因此,使用 ufunc(ar, indices) ,我们将得到:
    [ufunc(ar[indices[0]: indices[1]]), ufunc(ar[indices[1]: indices[2]]), ..]
    在我们的例子中,对于每个元组 (x,y) ,我们知道 x<y 。对于堆叠版本,我们有:
    [(x1,y1), (x2,y2), (x3,y3), ...]
    如果我们扁平化,它将是:
    [x1,y1,x2,y2,x3,y3, ...]
    所以,我们可能没有 y1<x2 ,但这没关系,因为我们不需要对那个和类似的 ufunc 减少 y2,x3 。但这没关系,因为可以通过最终输出的步长切片来跳过它们。
    因此,我们将有:
    # Inputs : a (1D array), start_end (2D array of shape (N,2))
    lens = start_end[:,1]-start_end[:,0]
    out = np.add.reduceat(a, start_end.ravel())[::2]/lens
    np.add.reduceat() 部分为我们提供了切片求和。我们需要通过 lens 除以进行平均计算。
    sample 运行 -
    In [47]: a
    Out[47]:
    array([0.49264042, 0.00506412, 0.61419663, 0.77596769, 0.50721381,
    0.76943416, 0.83570173, 0.2085408 , 0.38992344, 0.64348176,
    0.3168665 , 0.78276451, 0.03779647, 0.33456905, 0.93971763,
    0.49663649, 0.4060438 , 0.8711461 , 0.27630025, 0.17129342])

    In [48]: start_end
    Out[48]:
    array([[ 1, 3],
    [ 4, 5],
    [ 6, 12],
    [ 7, 10],
    [11, 12],
    [13, 19]])

    In [49]: [np.mean(a[i:j]) for (i,j) in start_end]
    Out[49]:
    [0.30963037472653104,
    0.5072138121177008,
    0.5295464559328862,
    0.41398199978967815,
    0.7827645134019902,
    0.5540688880441684]

    In [50]: lens = start_end[:,1]-start_end[:,0]
    ...: out = np.add.reduceat(a, start_end.ravel())[::2]/lens

    In [51]: out
    Out[51]:
    array([0.30963037, 0.50721381, 0.52954646, 0.413982 , 0.78276451,
    0.55406889])
    为了完整起见,引用给定的示例,转换步骤是:
    # Given start_end as df and values as a 2D array
    start_end = np.vstack(np.concatenate(start_end.values))
    a = values.ravel()
    对于其他具有 reduceat 方法的 ufunc,我们将替换 np.add.reduceat

    关于pandas - 如何对具有偏移量的向量应用操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62776121/

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