簡體   English   中英

加快將函數應用於pandas數據幀列表

[英]Speed up applying function to a list of pandas dataframes

我有一些時間序列數據,其中每個數據點是一個pandas數據幀,即數據幀列表。 我還有一個函數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應用於所有數據點仍需要很長時間。 我怎樣才能進一步加快速度?

我嘗試從數據創建一個pandas系列並使用series.apply() 但是,這並沒有導致常規for循環方法的任何加速。

編輯 :如果我之前不清楚,給定一個數據框,函數vect_foo非常有效。 我想要的是一種加速將vect_foo應用於所有數據點即數據幀列表的方法。

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

data是一個pandas數據幀列表,即data = [df1, df2, ..., df50K]

在這里,我嘗試了pandas.Series.apply()但它的執行方式類似於普通的for循環方法。

import pandas as pd

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

df.apply(foo, axis=1)

只需創建輔助函數並使用apply函數。 這通常是在pandaspandas /列應用函數的最有效方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM