加快将功能应用于熊猫数据框列表的速度

时间:2019-05-14 05:00:48

标签: python pandas vectorization

我有一些时间序列数据,其中每个数据点是一个熊猫数据帧,即数据帧列表。我还有一个在每个数据点上运行的函数foo。目的是在整个时间序列数据上应用该功能,并高效地进行操作。

我对函数foo进行了矢量化处理,使其可以在整个数据帧上运行,并实现了约32倍的加速。

原始代码如下:

def bar(row, cols):
    return tuple([row[col] for col in cols])

def foo(df, cols):
    keys = set()
    for index, row in df.iterrows():
        key = bar(row, cols)
        keys.add(key)

    # do calculations on keys that returns a numeric output, result
    return result # float64

矢量化代码如下:

def vect_bar(df, cols):
    df['key'] = df[cols].values.sum(axis=1)
    return df

def vect_foo(df, cols):
    df['key'] = ""
    df = vect_bar(df, cols)
    keys = df.key.unique()

    # do calculations on keys that returns a numeric output, result
    return result # float64

计时结果如下:

%timeit -n 100 foo(df, cols)
100 loops, best of 3: 42.9 ms per loop

%timeit -n 100 vect_foo(df, cols)
100 loops, best of 3: 1.34 ms per loop

注意: cols是列名称的列表。 数据框的所有元素都是字符串,并且是dtype对象。

但是,将vect_foo应用于所有数据点仍需要花费很长时间。如何进一步加快速度?

我尝试根据数据并使用series.apply()创建熊猫系列。但是,这并不会导致常规的for循环方法有任何提速。

编辑: 如果我之前不太清楚,给定一个数据帧,函数vect_foo会非常有效。 我想要的是一种将vect_foo应用于所有数据点(即数据帧列表)的方法。

data_series = pd.Series(data)
def apply_data():
    return data_series.apply(vect_foo, cols)

data是熊猫数据帧的列表,即data = [df1, df2, ..., df50K]

在这里,我尝试了pandas.Series.apply(),但其执行效果与普通的for循环方法类似。

1 个答案:

答案 0 :(得分:0)

import pandas as pd

def foo(row, cols):
    row['keys'] = row[cols].sum()
    return row

df.apply(foo, axis=1)

只需创建您的辅助函数并使用apply函数。这通常是跨pandas

中的行/列应用函数的最有效方法