繁体   English   中英

寻找一种在 Pandas 中加速此应用功能的方法

[英]Looking for a way to speed up this apply function in pandas

我目前正在使用一个 csv 文件,该文件包含具有 na 和 list 值的列。 当我读入数据时,列表值变为字符串值,即 [1, 2, 3] 变为“[1, 2, 3]”。 我曾尝试使用 ast.literal_eval 使用转换器读取数据,但不幸的是,由于数据中存在 na 值,此方法不起作用。

我通过将以下函数应用于有此问题的列来解决此问题。

import numpy as np

def string_to_list(row_value):
    if row_value is np.nan:
        return np.nan

    else:
        return eval(row_value)

现在的问题是数据框中有超过 200k 行并且多列有这个问题,所以这个方法需要很多时间(每列约 1.5 秒)。

下面是一个可重现的例子

import pandas as pd

column1 = [np.nan, "[1, 2, 3]", "[3, 2, 1]"] * 100000
df = pd.DataFrame(
    {
        'column1': column1
    }
)

df['column1'].apply(lambda x: string_to_list(x))

经过一些研究,我发现很多帖子都说矢量化是一种将函数应用于列的更快方法,但我不确定如何在我的情况下应用它。 我尝试了以下操作,但我不确定如何指定将函数运行到条件语句为假的索引。

np.where(
    pd.isna(x),
    x,
    string_to_list(x) #Confused on how to pass argument in here where the conditional statements results to False
)

任何建议表示赞赏,谢谢!

在你的情况下做ast

import ast 

df['column1'] = df['column1'].map(lambda x : ast.literal_eval(x)  if x == x else x)

有一个关于这个话题的一些讨论在这里,这表明使用以下(更无法读取)功能更快:

def string_to_list2(row_value):
    if row_value is np.nan:
        return np.nan
    else:
        return list(map(str.strip, row_value.strip('][').replace('"','').split(',')))

当我用 1000 行重新创建df时,情况似乎确实如此:

%%timeit 
df['column1'].apply(lambda x: string_to_list(x))
# 1000 loops, best of 5: 1.75 ms per loop

%%timeit 
df['column1'].apply(lambda x: string_to_list2(x))
# 1000 loops, best of 5: 555 µs per loop

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM