假设我们有一张顾客及其消费表 .
import pandas as pd
df = pd.DataFrame({
"Name": ["Alice", "Bob", "Bob", "Charles"],
"Spend": [3, 5, 7, 9]
})
LIMIT = 6
对于每个客户,我们可以使用 apply
方法计算大于6美元的支出比例:
df.groupby("Name").apply(
lambda grp: len(grp[grp["Spend"] > LIMIT]) / len(grp)
)
Name
Alice 0.0
Bob 0.5
Charles 1.0
但是, apply
方法is just a loop,如果有很多客户,则会很慢 .
Question: Is there a faster way, which presumably uses vectorization?
下面的代码导致Alice的空值:
df[df["Spend"] > LIMIT].groupby("Name").size() / df.groupby("Name").size()
Name
Alice NaN
Bob 0.5
Charles 1.0
下面的代码给出了正确的结果,但它要求我们修改表格,或者制作副本以避免修改原始文件 .
df["Dummy"] = 1 * (df["Spend"] > LIMIT)
df.groupby("Name") ["Dummy"] .sum() / df.groupby("Name").size()
1 回答
Groupby不使用矢量化,有cython优化函数 .
你可以聚合
mean
:或者使用div替换
NaN
到0
:要么:
Performance :
取决于每个条件过滤的行数和行数,因此最好在实际数据中进行测试 .
Numpy解决方案是矢量化的,但有点复杂: