相关疑难解决方法(0)

我什么时候应该在我的代码中使用pandas apply()?

这是一个自我回答的QnA,旨在指导用户应用的缺陷和好处.

我已经看到很多关于Stack Overflow问题的答案涉及使用apply.我也看到用户评论他们说" apply很慢",应该避免".

我已经阅读了很多关于性能主题的文章,解释apply很慢.我还在文档中看到了一个关于如何apply简单地传递UDF的便利函数的免责声明(现在似乎无法找到).因此,普遍的共识是,apply如果可能,应该避免.但是,这引发了以下问题:

  1. 如果apply是如此糟糕,那为什么它在API中呢?
  2. 我应该如何以及何时制作我的代码apply- 免费?
  3. 是否有过任何地方的情况apply不错的(比其他可能的解决方案更好)?

python performance apply pandas

68
推荐指数
3
解决办法
8380
查看次数

使用带有不匹配索引的 pandas .loc 时内存爆炸+分配导致重复轴错误

这是从大多数Pythonic方式将pandas单元与条件连接起来的观察\n我无法理解为什么第三个解决方案比第一个解决方案需要更多的内存。

\n
    \n
  • 如果我不采样第三个解决方案不会给出运行时错误,显然有些事情很奇怪

    \n
  • \n
  • 为了模拟大型数据帧,我尝试重新采样,但没想到会遇到这种错误

    \n
  • \n
\n

背景

\n

非常不言自明,一行,看起来Pythonic

\n
df[\'city\'] + (df[\'city\'] == \'paris\')*(\'_\' + df[\'arr\'].astype(str))\n
Run Code Online (Sandbox Code Playgroud)\n
s = """city,arr,final_target\nparis,11,paris_11\nparis,12,paris_12\ndallas,22,dallas\nmiami,15,miami\nparis,16,paris_16"""\nimport pandas as pd\nimport io\ndf = pd.read_csv(io.StringIO(s)).sample(1000000, replace=True)\ndf\n
Run Code Online (Sandbox Code Playgroud)\n

速度

\n
s = """city,arr,final_target\nparis,11,paris_11\nparis,12,paris_12\ndallas,22,dallas\nmiami,15,miami\nparis,16,paris_16"""\nimport pandas as pd\nimport io\ndf = pd.read_csv(io.StringIO(s)).sample(1000000, replace=True)\ndf\n
Run Code Online (Sandbox Code Playgroud)\n
%%timeit\ndf[\'city\'] + (df[\'city\'] == \'paris\')*(\'_\' + df[\'arr\'].astype(str))\n# 877 ms \xc2\xb1 19.2 ms per loop (mean \xc2\xb1 std. dev. of 7 runs, 1 loop each)\n
Run Code Online (Sandbox Code Playgroud)\n
如果我不采样,则不会出现错误,并且输出也完全匹配
\n

错误(已更新)(仅当我从数据帧采样时发生)

\n
%%timeit\ndf[\'final_target\'] = np.where(df[\'city\'].eq(\'paris\'), \n …
Run Code Online (Sandbox Code Playgroud)

python performance memory-management numpy pandas

7
推荐指数
1
解决办法
1363
查看次数

标签 统计

pandas ×2

performance ×2

python ×2

apply ×1

memory-management ×1

numpy ×1