[英]SQL “partition by” similar feature in Python/R
在R(data.table / dplyr)或Python中是否有任何軟件包可以以一致且直接的方式在下面執行SQL代碼?
您可以分享一些這樣做的例子嗎?
我需要的示例:
我的輸入數據幀(CSV,sep-“;”,標題-True):
articule;group;is_new;ammount
1;fruits;1;100
2;fruits;1;200
3;fruits;1;300
4;fruits;0;400
5;frozen;0;500
6;frozen;0;600
7;frozen;0;700
8;frozen;1;800
我的預期輸出(CSV,sep-“;”,標題-True):
articule;group;is_new;ammount;sum_by_group;sum_by_group_is_new;result
1;fruits;1;100;1000;600;0.60
2;fruits;1;200;1000;600;0.60
3;fruits;1;300;1000;600;0.60
4;fruits;0;400;1000;400;0.40
5;frozen;0;500;2600;1800;0.69
6;frozen;0;600;2600;1800;0.69
7;frozen;0;700;2600;1800;0.69
8;frozen;1;800;2600;800;0.31
我在SQL中的代碼:
select a.*, sum_by_group_is_new / sum_by_group result from (
select a.*,
sum(ammount) over (partition by group) sum_by_group,
sum(ammount) over(partition by group, is_new) sum_by_group_is_new
from input_data_frame a
) a;
最好的祝福
在這種情況下,可以對groupby
使用transform
方法。 它有點像工作SQL的partition by
df['sum_by_group'] = df.groupby('group').ammount.transform(sum)
df['sum_by_group_is_new'] = df.groupby(['group', 'is_new']).ammount.transform(sum)
df['result'] = df.sum_by_group_is_new / df.sum_by_group
這給了我以下輸出數據幀。
articule group is_new ammount sum_by_group sum_by_group_is_new result
0 1 fruits 1 100 1000 600 0.600000
1 2 fruits 1 200 1000 600 0.600000
2 3 fruits 1 300 1000 600 0.600000
3 4 fruits 0 400 1000 400 0.400000
4 5 frozen 0 500 2600 1800 0.692308
5 6 frozen 0 600 2600 1800 0.692308
6 7 frozen 0 700 2600 1800 0.692308
7 8 frozen 1 800 2600 800 0.307692
歡迎來到SO!
這是您可以使用R做的事情:
library(data.table)
DT <- data.table(
articule = seq(8),
group = rep(c("fruits", "frozen"), each = 4),
is_new = c(rep(c(1, 0), each = 3), 0, 1),
ammount = seq(100, 800, by = 100)
)
DT[, sum_by_group := sum(ammount), by = group]
DT[, sum_by_group_is_new := sum(ammount), by = .(group, is_new)]
DT[, result := sum_by_group_is_new / sum_by_group]
print(DT)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.