我想用数据框做一些计算
ID | 方法 | 国家 | 数量 | 成功 |
---|---|---|---|---|
95 | 和平 | 白俄罗斯 | 6063 | 0 |
96 | 大师 | 日本 | 4013 | 0 |
97 | 美国运通 | 白俄罗斯 | 1426 | 1 |
98 | 大师 | 白俄罗斯 | 5692 | 1 |
99 | 万事达 | 俄罗斯 | 6929 | 1 |
我想按方法和国家、付款次数、成功率和成功付款总额计算平均金额。
Success Rate = (Number of payments where Success = 1) / All payments
在 SQL 中,我会做到这一点非常简单
SELECT country,
method,
avg(amount),
count(1),
count(CASE WHEN success = 1 THEN id END) / count(1) AS conversion,
sum(CASE WHEN success = 1 THEN amount END) sum_success,
FROM data
GROUP BY country, method;
前两个计算在 Python 中也相对简单。
df.groupby(['Country', 'Method']).agg({'Amount': ['mean', 'count']})
但是第三,第四次计算似乎不太可能,不费吹灰之力。
有没有办法快速而优雅地做到这一点?
请不要说我可以通过采用 Success 列的 mean() 来计算成功率。我知道。我已经简化了我实际要做的事情,我的真正任务无法通过这种方式解决。
SQL 可以在返回结果之前解析您的语句(它甚至可以找出列名,即使它们是大写或小写的)- 只要您使用正确的关键字,SQL 就可以轻松实现这种方式;在 Pandas 中,通常情况下,您必须明确;在这种情况下,您必须在聚合之前事先创建一些列 - 通常情况下,这样做会更快:
# create the columns that will be needed
(df.assign(sum_success = lambda df: df.Amount.where(df.Success==1),
conversion = lambda df:df.Success.eq(1))
.groupby(['Country', 'Method'])
.agg(Amount=('Amount', 'mean'),
count=('Amount', 'size'),
conversion=('conversion', 'sum'),
sum_success = ('sum_success', 'sum'))
.reset_index() # indexes are useful, so you may not reset ... it depends
)
Country Method Amount count conversion sum_success
0 Belarus American Express 1426.0 1 1 1426.0
1 Belarus Maestro 5692.0 1 1 5692.0
2 Belarus Мир 6063.0 1 0 0.0
3 Japan Maestro 4013.0 1 0 0.0
4 Russia Mastercard 6929.0 1 1 6929.0
请注意conversion
,我不必创建条件本身,我只是使用布尔结果并将其汇总到 agg 部分。因此,根据聚合,您可能需要使其适应 Pandas 的细微差别。
顺便说一句,Python 中还有另一种数据处理 - datatable
,它允许嵌套计算,类似于 SQL。它仍在增长,但不像熊猫那样功能丰富。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句