【问题标题】:Most optimized way to perform calculations on rows of lists of various sizes对各种大小的列表行执行计算的最优化方法
【发布时间】:2020-05-29 10:40:21
【问题描述】:

给定以下数据框:

df = pd.DataFrame({'list_col': [np.random.randint(0,100,size=(1, np.random.randint(0,10)))[0] for i in range(100000)]})

返回每行总和的最佳方法是什么? (空行 = 0)

我读到在 pandas 中通常不鼓励使用 .apply

df.list_col.apply(sum)

但是,在尝试正确使用矢量化计算时,我只能提出以下建议:

np.nansum(pd.DataFrame(df.list_col.values.tolist()).values, axis=1)

结果变慢了:

那么在不同大小的列表数组上使用 numpy 的矢量化计算的正确方法是什么?

【问题讨论】:

  • df["list_col"].map(sum) 对我来说比两者都快。
  • @TobyPetty 很有趣,有什么解释为什么 map 会比 apply 快吗?
  • 只是“优化”。你不能“更多”或“更少”优化:)
  • 不能“向量化”不同长度的列表或数组。快速的numpy 代码适用于矩形数字数组。您的列表不能组合成一个二维整数数组。
  • 您有一系列列表,我不确定您对 NumPy 的期望。请澄清一下。

标签: python arrays pandas list numpy


【解决方案1】:

考虑listmap 的速度比其他的快一点

%timeit df.list_col.apply(sum)
10 loops, best of 3: 130 ms per loop
%timeit np.nansum(pd.DataFrame(df.list_col.values.tolist()).values, axis=1)
1 loop, best of 3: 169 ms per loop
%timeit list(map(sum,df.list_col.tolist()))
10 loops, best of 3: 93.6 ms per loop

【讨论】:

  • 干得好,这确实比其他方法快一点
【解决方案2】:

我认为您的方法非常优化,可以节省几毫秒

%timeit df['list_col'].map(sum)
162 ms ± 5.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df['list_col'].apply(sum)
156 ms ± 747 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit df['list_col'].map(np.sum)
306 ms ± 3.51 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

我更喜欢在series 操作时使用map,因为apply 通常用于dataframes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多