Pandas 选择性累积和的矢量化

Pandas 选择性累积和的矢量化,pandas,numpy,vectorization,Pandas,Numpy,Vectorization,我有一个熊猫系列,其中每个元素都是一个带有索引的列表: series_example = pd.Series([[1, 3, 2], [1, 2]]) 此外,我还有一个数组,其中的值与每个索引关联: arr_example = np.array([3., 0.5, 0.25, 0.1]) 我想创建一个新的系列,该系列包含由输入系列行中的索引给出的数组元素的累积和。在本例中,输出系列将包含以下内容: 0 [0.5, 0.6, 0.85] 1 [0.5, 0.75] dtype: o

我有一个熊猫系列,其中每个元素都是一个带有索引的列表:

series_example = pd.Series([[1, 3, 2], [1, 2]])
此外,我还有一个数组,其中的值与每个索引关联:

arr_example = np.array([3., 0.5, 0.25, 0.1])
我想创建一个新的
系列
,该系列包含由输入
系列
行中的索引给出的数组元素的累积和。在本例中,输出
系列
将包含以下内容:

0    [0.5, 0.6, 0.85]
1    [0.5, 0.75]
dtype: object
非矢量化的方法如下:

def non_vector_transform(series, array):
    series_output = pd.Series(np.zeros(len(series_example)), dtype = object)
    for i in range(len(series)):
        element_list = series[i]
        series_output[i] = []   
        acum = 0
        for element in element_list:
            acum += array[element]
            series_output[i].append(acum)
    return series_output
我想以矢量化的方式来做这件事。有没有矢量化魔术师能在这里帮我?

使用并:

或者,如果您更喜欢
for
循环:

import numpy as np
import pandas as pd
series_example = pd.Series([[1, 3, 2], [1, 2]])
arr_example = np.array([3., 0.5, 0.25, 0.1])
# Copy only if you do not want to overwrite the original series
result = series_example.copy()
for i, x in result.iteritems():
    result[i] = np.cumsum(arr_example[x])
print(result)
输出:

0    [0.5, 0.6, 0.85]
1         [0.5, 0.75]
dtype: object
使用和:

或者,如果您更喜欢
for
循环:

import numpy as np
import pandas as pd
series_example = pd.Series([[1, 3, 2], [1, 2]])
arr_example = np.array([3., 0.5, 0.25, 0.1])
# Copy only if you do not want to overwrite the original series
result = series_example.copy()
for i, x in result.iteritems():
    result[i] = np.cumsum(arr_example[x])
print(result)
输出:

0    [0.5, 0.6, 0.85]
1         [0.5, 0.75]
dtype: object

我懂了。问题是,这将按列进行矢量化。我想知道是否可以按行进行矢量化。@DavidMasip这里的行和列是什么意思?pd.Series
只是一行/列。。。您是否有一个
pd.DataFrame
?对不起,我没有正确解释。在这里,您使用cumsum对每一行执行的操作进行矢量化。然而,apply并没有完全矢量化,正如我所理解的,在这个意义上,执行简单的numpy操作比apply更好。事实上,有些人声称apply甚至比循环慢:至少他将
cumsum
矢量化。我不知道你是否能将计算机上的操作矢量化list@DavidMasip我想我明白你的意思。。。问题是每个列表都有不同的大小,所以我不确定如何更好地对其进行矢量化(这并不是说我100%确定这是不可能的)。关于性能,
apply
通常比循环好一些,但正如您发布的链接所指出的,它可能会陷入糟糕的情况。这里描述的不是这种情况(您有一个
pd.Series
,而不是
pd.DataFrame
,并且
np.cumsum
返回
np.ndarray
,而不是
pd.Series
),但我无法判断出于某种原因,它在这里是否特别低效。我也添加了一个循环解决方案。我明白了。问题是,这将按列进行矢量化。我想知道是否可以按行进行矢量化。@DavidMasip这里的行和列是什么意思?pd.Series
只是一行/列。。。您是否有一个
pd.DataFrame
?对不起,我没有正确解释。在这里,您使用cumsum对每一行执行的操作进行矢量化。然而,apply并没有完全矢量化,正如我所理解的,在这个意义上,执行简单的numpy操作比apply更好。事实上,有些人声称apply甚至比循环慢:至少他将
cumsum
矢量化。我不知道你是否能将计算机上的操作矢量化list@DavidMasip我想我明白你的意思。。。问题是每个列表都有不同的大小,所以我不确定如何更好地对其进行矢量化(这并不是说我100%确定这是不可能的)。关于性能,
apply
通常比循环好一些,但正如您发布的链接所指出的,它可能会陷入糟糕的情况。这里描述的不是这种情况(您有一个
pd.Series
,而不是
pd.DataFrame
,并且
np.cumsum
返回
np.ndarray
,而不是
pd.Series
),但我无法判断出于某种原因,它在这里是否特别低效。无论如何,我也添加了一个循环解决方案。