加速Pandas字符串操作
Pandas字符串操作加速
本教程专注于加速字符串操作。
我感到无聊,决定对字符串操作方法进行基准测试,以及它们对pandas数据帧性能的影响。众所周知,一旦Pandas数据帧超过一定限制,它们会表现出奇怪的行为。这主要取决于内存压力,以及在一次操作多个行的元素时产生的一些开销。
所以,这是实验内容。
我使用Faker创建了一个数据帧。基础数据是10万行的虚假数据。
设置
!pip install faker
import pandas as pdimport numpy as npdef gen_data(x): from faker import Faker fake = Faker() outdata = {} for i in range(0,x): outdata[i] = fake.profile() return pd.DataFrame(outdata).Tn= 100000basedata = gen_data(n)
我通过将输出映射到Google Colab将其存储在Google Drive中
from google.colab import drivedrive.mount('/content/drive')
我创建了非常简单的函数来测试各种连接两个字符串的方法。
def process(a,b): return ''.join([a,b])def process(a,b): return a+bdef process(a,b): return f"{a}{b}"def process(a,b): return f"{a}{b}"*100
然后我决定创建一个空的数据帧,并编写一个函数将%%timeit
的输出作为一行添加到数据帧中
# 使用%%timeit的输出将一行添加到数据帧中def add_to_df(n, m, x, outputdf): outputdf.loc[len(outputdf.index)] = [m, n, x]# 输出数据帧outputdf = pd.DataFrame(columns=['method', 'n', 'timing'])outputdf
以下是运行每个函数并将数据导出到pandas数据帧的代码示例。
# 获取数据样本n = 10000suffix = 'fstring_100x'data = basedata.copy().sample(n).reset_index()
%%timeit -r 7 -n 1 -odata['newcol'] = ''for row in range(len(data)): data.at[row ,'newcol'] = process(data.at[row, 'job'], data.at[row, 'company'])# 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)# <TimeitResult : 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>
m = "迭代每一行"add_to_df(n = n, m = m, x = vars(_), outputdf = outputdf)