【问题标题】:Can I apply a vectorized function to a pandas dataframe?我可以将矢量化函数应用于熊猫数据框吗?
【发布时间】:2017-03-04 22:06:26
【问题描述】:

我对@9​​87654321@ 和numpy 还很陌生,我正在尝试找出做某些事情的最佳方法。

现在我正在尝试在dataframe 的每一行上调用一个函数。如果我将三个numpy 数组传递给这个函数,它非常快,但是在dataframe 上使用apply 非常慢。

我的猜测是numpy 在第一种情况下使用矢量化函数,而不是在第二种情况下。有没有办法让pandas 使用该优化?基本上,在伪代码中,我认为apply 正在做类似for row in frame: func(row['a'], row['b'], row['c']) 的事情,但我希望它做func(col['a'], col['b'], col['c'])

这是我正在尝试做的一个示例。

import numpy as np
import pandas as pd
from scipy.stats import beta

count = 100000

# If I start with a given dataframe and use apply, it's very slow

df = pd.DataFrame(np.random.uniform(0, 1, size=(count, 3)), columns=['a', 'b', 'c'])
df.apply(lambda frame: beta.cdf(frame['a'], frame['b'], frame['c']), axis=1)

# However, if I split out each column into a numpy array, this is very fast.

a = df['a'].as_matrix()
b = df['b'].as_matrix()
c = df['c'].as_matrix()

beta.cdf(a, b, c)

# But at this point I've lost the context of the dataframe.
# I would like to keep the results in a new column for further processing

【问题讨论】:

  • 矢量化将是特定于功能的。那么,您是想仅对 beta.cdf 进行矢量化,还是可能有其他人?
  • 那么 beta.cdf 已经接受了数组(和系列),为什么要使用 apply 而不是那个?
  • 为什么不直接打电话给beta.cdf(df.a, df.b, df.c)
  • 抱歉,我想还不清楚。我从dataframe 开始。所以我需要将列提取到numpy 数组中才能直接调用beta.cdf。我可以这样做,但这会丢失数据框中的所有其他上下文。我将编辑问题以使其更清楚。
  • 您不需要将它们转换为 numpy 数组。见我之前的评论。你可以做beta.cdf(df.a, df.b, df.c)

标签: python pandas numpy dataframe vectorization


【解决方案1】:

不清楚您为什么要尝试使用apply。你可以做beta.cdf(df.a, df.b, df.c)

【讨论】:

  • 再次感谢。我没有意识到我可以将 dataframe 列传递给矢量化函数。
  • 当然可以!回想一下 pandas 数据框中的每一列都是一个 pandas 系列。
猜你喜欢
  • 2021-12-30
  • 2018-02-05
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 2018-03-21
相关资源
最近更新 更多