gpt4 book ai didi

python - Pandas dataframe - get_value 在 apply 中的表现

转载 作者:太空宇宙 更新时间:2023-11-04 09:53:24 25 4
gpt4 key购买 nike

我有一个包含大约 100 万行和 3 列的数据框(句子,一个 100 个字符范围内的字符串,lang,一个 3 个字符的字符串,以及i_sent,一个整数)。

我正在尝试使用名为 compute_coverage 的函数生成一个新系列,该函数接受一个句子及其对应的语言,并返回一个 float :

absolute_coverage = df.apply(lambda x: compute_coverage(x['sentence'], x['lang']),
axis=1)

compute_coverage 是一个相当简单的函数,但是生成序列需要很长时间(大约 50 秒)。经过分析(结果如下),事实证明大部分时间花在了 pandas 的 get_value 函数上,大概是为了获取 x['sentence']x['lang'].

我做错了吗?这是预期的吗?是否有更好的方法来执行逐行操作?

谢谢!


编辑:

我想我的意思是有没有办法避免调用 get_value()?例如,如果我这样做

x = df.apply({'sentence': lambda x: compute_coverage(x, 'fra')})

(显然返回不正确的结果,但执行相同数量的计算),运行时间下降了 90%。

函数体:

def compute_coverage(sentence, lang):
words = sentence.split()
return len(set(words)) / (lang_vocab[lang] * len(words))

lang_vocab 是一个 8 元素字典。


         120108317 function calls (114648864 primitive calls) in 150.379 seconds

Ordered by: internal time
List reduced from 141 to 10 due to restriction <10>

ncalls tottime percall cumtime percall filename:lineno(function)
2729722 13.090 0.000 83.294 0.000 base.py:2454(get_value)
1 11.105 11.105 150.064 150.064 {pandas._libs.lib.reduce}
1364861 10.287 0.000 16.268 0.000 <ipython-input-16-0ab58d43622d>:3(compute_coverage)
2729722 8.953 0.000 95.187 0.000 series.py:598(__getitem__)
2729722 7.476 0.000 7.476 0.000 {method 'get_value' of 'pandas._libs.index.IndexEngine' objects}
8189190 7.460 0.000 16.088 0.000 {built-in method builtins.getattr}
13648677/8189224 6.484 0.000 9.794 0.000 {built-in method builtins.len}
5459444 6.244 0.000 20.539 0.000 {pandas._libs.lib.values_from_object}
1364864 5.801 0.000 17.845 0.000 series.py:284(_set_axis)
8189277 5.637 0.000 8.747 0.000 {built-in method builtins.isinstance}

最佳答案

这是提取 (get_value) 2 次,每次提取一个值

df.apply(lambda x: compute_coverage(x['sentence'], x['lang']),
axis=1)

可以重写为

df[['sentence', 'lang']].apply(lambda x: compute_coverage(*x))

它更快,因为在一次尝试中选择了两个值(这进一步解压缩并作为参数传递给 compute_coverage 函数)。

对于 100,000 行数据帧,第一种方法耗时 7.77 秒,对于相同的数据,第二种方法耗时 4.78 秒。 第二种方法似乎快了 40%


对于我有 100,000 条记录的数据框

df = pd.DataFrame({'a':list('abcd')*100000, 
'b':list(range(4))*100000,
'c': list(range(3,7))*100000
})
def f(x, y):
return str(x)+str(y)

df.apply(lambda x: f(x['a'], x['b']), axis=1) 耗时 7.66 秒
df[['a', 'b']].apply(lambda x: f(*x), axis=1) 耗时 4.67 秒
df.apply(lambda x: f(*x[['a', 'b']]), axis=1) 耗时 1 分 54 秒

在 jupyter notebook (python3) 中使用 %%timeit 测量运行时间

关于python - Pandas dataframe - get_value 在 apply 中的表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46914746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com