python - 寻找一种方法来加速 Pandas 中的这个应用功能

标签 python pandas vectorization apply

我目前正在处理一个 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)

现在的问题是 dataframe 中有超过 200k 行,并且多列都有这个问题,所以这种方法会花费很多时间(每列约 1.5s)。

下面是一个可重现的例子

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
)

感谢任何建议,谢谢!

最佳答案

关于这个话题有一些讨论here ,这表明使用以下(更难读)函数速度更快:

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 时,情况确实如此(感谢 @HarryPlotter 在评论中的建议):

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

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

关于python - 寻找一种方法来加速 Pandas 中的这个应用功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69959719/

相关文章:

Python3绑定(bind)方法

python - Django 部署上的内部服务器错误

Python:如何从 pandas 列中删除所有非数字值?

python - 如何使用 Pandas 展平层次结构

R - 比较两个数据集时如何避免循环?

python - 合并具有相同命名组的正则表达式

python - 基于 Pandas 优化/并行计算一个简单但大的循环

python - 更有效的循环方式?

python - 使用 2x2 矩阵广播 2D 点列表的点积

python - 如何使用 openpyxl 和 Pandas 自动化我的代码?