【问题标题】:Replace pandas iterrows with vectorization/apply用矢量化/应用替换 pandas iterrows
【发布时间】:2020-08-02 03:30:48
【问题描述】:

考虑以下示例,我将遍历每一行,将它们分成两个样本,并为每行执行一个统计测试:

    for index, row in data.iterrows():
        stat, p = mannwhitneyu(row.iloc[:self.neighbors], row.iloc[self.neighbors:], alternative = 'greater')
        data.loc[index, 'stat'] = stat
        data.loc[index, 'prob'] = p

有什么方法可以加快速度吗?我看到 Apply 或 Vectorization 应该可以改进它,但我真的不知道它是如何实现的,因为我需要逐行执行相同的测试。

感谢您的帮助!

【问题讨论】:

标签: python pandas loops


【解决方案1】:

如果您指定axis=1,您可以应用到行。在你的情况下,它会是这样的:

def change_value(row):
    stat, p = mannwhitneyu(row.iloc[:self.neighbors], row.iloc[self.neighbors:], 
    alternative = 'greater')
    row['stat'] = stat
    row['prob'] = p

#Assuming your dataframe is called df
df.apply(change_value, axis=1)

【讨论】:

  • 感谢您的帮助!然而,有趣的是,在实现 apply 函数时,我的算法运行速度甚至比以前更慢......你认为有某种矢量化版本吗?
  • 这太令人惊讶了。说到速度,最明显的事情就是使用 numpy 数组。这将摆脱熊猫开销。也许看看如何在你的用例中使用数组
猜你喜欢
  • 2019-12-21
  • 2016-09-28
  • 2021-08-09
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2021-02-10
  • 2021-01-18
相关资源
最近更新 更多