【问题标题】:Convert SQL data aggregation code to Python [closed]将 SQL 数据聚合代码转换为 Python [关闭]
【发布时间】:2019-08-20 21:38:20
【问题描述】:

我是 Python 新手,需要将用于数据聚合的简单 SAS SQL 代码转换为 Python。

以虹膜数据为例:

from bokeh.sampledata.iris import flowers 

我在 SAS 中做什么:

create table data_2 as 
select species
      ,petal_width
      ,sum(sepal_length) as total_length
      ,sum(sepal_length*sepal_width)/sum(sepal_length) as ratio
 from flowers
 group by 1,2; 

输出

species    petal_width   total_sepal_length  ratio
setosa        0.1           29                 3.24
------         ---          ---                ---

我需要将数百个此类查询转换为 Python。我使用Python groupby 和 sum 函数,但我只能一步一步做,所以我的代码很长。如何以有效的方式在 Python 中做到这一点?

【问题讨论】:

  • 如果您使用“groupby”,听起来您使用的是 pandas。如果是这样,您是否有一个数据框并且您希望在其上执行与那条 SQL 相同的操作?如果是这样,您能否提供一个示例数据框以及所需的输出? (我们称之为minimal, complete, and verifiable example。)
  • @fuglede 是的。我需要数据框,并希望获得与 SQL 所做的相同的聚合结果,包括新列命名。
  • 所以您是要我们为您编写 pandas 代码?
  • @roganjosh 是的。如果您可以为我编写一些代码开始,这将非常有帮助。谢谢。
  • 但是 Stack Overflow 不是代码编写服务。我们帮助解决现有代码中的问题;这太宽泛了。

标签: python sql pandas aggregate-functions pandas-groupby


【解决方案1】:

如果 df 是您的数据框,那么像 df.groupby(['segment', 'time']).apply(lambda x: pd.Series({'total': x.weight.sum(), 'rate': (x.weight*x.score).sum()/x.weight.sum()})) 这样的东西应该可以完成这项工作。例如,

In [111]: df
Out[111]:
  segment  time  weight  score
0       A     0      10     30
1       B     1      20     40
2       A     0      30     50
3       B     1      40     60

In [112]: df.groupby(['segment', 'time']).apply(lambda x: pd.Series({'total': x.weight.sum(), 'rate': (x.weight*x.score).sum()/x.weight.sum()}))
Out[112]:
              total       rate
segment time
A       0      40.0  45.000000
B       1      60.0  53.333333

【讨论】:

  • 谢谢。我正在为我的问题创建数据样本,但没有注意到您提供了答案。真的很感激。我是堆栈溢出的新手,我会记住论坛规则以备将来的问题。
  • 别担心,欢迎来到 Stack Overflow!
猜你喜欢
  • 1970-01-01
  • 2011-11-28
  • 1970-01-01
  • 2018-05-13
  • 2011-05-06
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多