加速 Pandas 迭代

Shi*_*hal 2 data-analysis dataframe python-3.x pandas

我有包含 3 列的 DataFrame:CustomerId、Amount 和 Status(成功或失败)。DataFrame 没有以任何方式排序。一个 CustomerId 可以在 DataFrame 中重复多次。

我想使用以下逻辑在此 DataFrame 中引入新列:

df[totalamount]= 状态为成功的每个客户的金额总和。

我已经有一个正在运行的代码,但是 df.iterrows 需要太多时间。因此请您提供替代方法,如熊猫矢量化或 numpy 矢量化。

例如,我想从前三列创建 'totalamount' 列:

   CustomerID  Amount   Status  totalamount
0           1       5  Success          105 # since both transatctions were successful
1           2      10   Failed           80 # since one transaction was successful
2           3      50  Success           50
3           1     100  Success          105
4           2      80  Success           80
5           4      60   Failed            0
Run Code Online (Sandbox Code Playgroud)

ALo*_*llz 5

使用where与掩盖“失败”行NaN,同时保持数据帧的长度。然后groupby是 CustomerID 和transform'Amount' 列的总和,将结果返回到每一行。

df['totalamount'] = (df.where(df['Status'].eq('Success'))
                       .groupby(df['CustomerID'])['Amount']
                       .transform('sum'))

   CustomerID  Amount   Status  totalamount
0           1       5  Success        105.0
1           2      10    Faled         80.0
2           3      50  Success         50.0
3           1     100  Success        105.0
4           2      80  Success         80.0
5           4      60   Failed          0.0
Run Code Online (Sandbox Code Playgroud)

使用where(而不是对 DataFrame 进行子集化)的原因是因为 groupby + sum 默认将整个NaN组总和为 0,因此我们不需要任何额外的东西来处理 CustomerID 4,例如。