python - 使用 .apply 或传递一列数据框有什么区别

标签 python pandas

我希望将一个简单的函数应用于 Pandas Dataframe 中的列。我用两种不同的方式做到了:

  • 1.df['column1']=myFunction(df['column1'])
  • 2.df['column1']=df['column1'].apply(lambda x:myFunction[x])

我的数据集不是很大,无法区分,但我猜这与速度有关。

谁能解释一下区别是什么,哪个是首选?

最佳答案

  • 1.df['column1']=myFunction(df['column1'])

在这里您定义了一个应用于 pd.Series 的函数。您让 pandas 处理这将如何发生。

  • 2.df['column1']=df['column1'].apply(lambda x:myFunction[x])

在这里,您要对每个元素应用一个函数。

一般来说,选项 1 会比选项 2 快。这在很大程度上取决于您的实际 myFunction 是什么,这是矢量化的还是逐个元素的。


案例:

让我们创建一个包含 2 列和 100,000 行的数据框(足够大以了解速度差异),并对 column1 的元素进行平方:

In [1]: 
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(100000,2),
                  columns=['column1','column2'])

def myFunction(s):
    return s**2

In [2]: %%timeit
    ...: myFunction(df.column1)
    ...: 
1000 loops, best of 3: 1.68 ms per loop

In [3]: %%timeit
    ...: df.column1.apply(lambda x: x**2)
    ...: 
10 loops, best of 3: 55.4 ms per loop

所以在这里您看到在 pd.Series 上执行操作比逐个元素快 30 多倍。那是因为 myFunction 是矢量化的。


现在,让我们举一个例子,其中您的 myFunction 不是矢量化的,而是逐个元素的:

In [4]: def myFunction(s):
...:     return s.apply(lambda x: x**2)
...: 

In [4]: %%timeit
    ...: myFunction(df.column1)
    ...: 
10 loops, best of 3: 53.9 ms per loop

基本上这和直接apply

是一样的

关于python - 使用 .apply 或传递一列数据框有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41131832/

相关文章:

python - 产生所有排列的随机子集

python - 无需硬编码即可映射多个值

python - 在django中将两个字段相乘

python - Pandas 在移动的数据帧上滚动

python - 对 pandas 数据框中列表内的单词进行词形还原

python - 从多索引 pandas 中选择

python - Argparse:如何声明多组参数对于一个子命令是互斥的?如何定义子命令的几种使用方式?

python - 你如何在python中打印出空行?

python - 如何在 Pandas 中显示列的全文

Python Pandas .DataFrame.from_csv