[英]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.