- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有这样的数据
location sales store
0 68 583 17
1 28 857 2
2 55 190 59
3 98 517 64
4 94 892 79
...
对于每个独特的组合(位置、商店),都有 1 次或多次销售。我想添加一列 pcnt_sales
,它显示给定行中的销售额占该对(位置、商店)总销售额的百分比。
location sales store pcnt_sales
0 68 583 17 0.254363
1 28 857 2 0.346543
2 55 190 59 1.000000
3 98 517 64 0.272105
4 94 892 79 1.000000
...
这有效,但是很慢
import pandas as pd
import numpy as np
df = pd.DataFrame({'location':np.random.randint(0, 100, 10000), 'store':np.random.randint(0, 100, 10000), 'sales': np.random.randint(0, 1000, 10000)})
import timeit
start_time = timeit.default_timer()
df['pcnt_sales'] = df.groupby(['location', 'store'])['sales'].apply(lambda x: x/x.sum())
print(timeit.default_timer() - start_time) # 1.46 seconds
相比之下,R 的 data.table
做起来 super 快
library(data.table)
dt <- data.table(location=sample(100, size=10000, replace=TRUE), store=sample(100, size=10000, replace=TRUE), sales=sample(1000, size=10000, replace=TRUE))
ptm <- proc.time()
dt[, pcnt_sales:=sales/sum(sales), by=c("location", "store")]
proc.time() - ptm # 0.007 seconds
我如何在 Pandas 中高效地执行此操作(特别是考虑到我的真实数据集有数百万行)?
最佳答案
为了性能你想避免apply
。您可以使用 transform
将 groupby 的结果扩展为原始索引,此时除法将以矢量化速度工作:
>>> %timeit df['pcnt_sales'] = df.groupby(['location', 'store'])['sales'].apply(lambda x: x/x.sum())
1 loop, best of 3: 2.27 s per loop
>>> %timeit df['pcnt_sales2'] = (df["sales"] /
df.groupby(['location', 'store'])['sales'].transform(sum))
100 loops, best of 3: 6.25 ms per loop
>>> df["pcnt_sales"].equals(df["pcnt_sales2"])
True
关于python - 如何加速 pandas groupby - 应用函数与 R 的 data.table 相媲美,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37106537/
This thread表示 LINQ 的 OrderBy 使用快速排序。考虑到 OrderBy 返回一个 IEnumerable,我正在努力理解它的意义。 我们以下面这段代码为例。 int[] arr
快速浏览一下 stackoverflow,我还没有找到(所以希望这不是重复的问题)类似的问题(也有很长的内容)。我也相信TJ holowaychuck,他创建了很多优秀的node.js(javascr
我有这样的数据 location sales store 0 68 583 17 1 28 857 2 2 55
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我是一名优秀的程序员,十分优秀!