SQL";按“划分”;Python/R中的类似特性

SQL";按“划分”;Python/R中的类似特性,python,sql,r,pandas,dplyr,Python,Sql,R,Pandas,Dplyr,在R(data.table/dplyr)或Python中是否有任何包可以以某种一致和直接的方式执行下面的SQL代码 你能分享一些这样做的例子吗 我需要的示例: 我的输入数据帧(CSV,sep-“;”,标题-真): 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

在R(data.table/dplyr)或Python中是否有任何包可以以某种一致和直接的方式执行下面的SQL代码

你能分享一些这样做的例子吗

我需要的示例:

我的输入数据帧(CSV,sep-“;”,标题-真):

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
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
我的预期输出(CSV,sep-“;”,标题-真):

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
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
一起使用。它有点像SQL的
分区方式

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)
库(data.table)

这可能会有帮助。你能给你的问题添加一些输入和输出数据吗?我已经添加了一个例子。请看一下这个,好吗?请将示例添加为文本(而不是图像),这样我们就可以将其复制到python(或sql FIDLE)中并获得数据帧/sql表。另外,请发布输入和预期输出。我已经添加了输入和预期数据帧,请看这个。非常感谢!我在Dplyr中写了这篇文章,得到了:df%>%groupby(group)%%>%mutate(by_group=sum(amount))%%>%groupby(group,is_new)%%>%mutate(by_group\u is_new=sum(amount))%%mutate(result=by_group\u is_new/by_group)