【问题标题】:Convert SAS proc sql to Python(pandas)将 SAS proc sql 转换为 Python(熊猫)
【发布时间】:2020-06-18 13:20:24
【问题描述】:

我使用 Pandas 库将一些代码从 SAS 重写为 Python。

我有这样的代码,但我不知道该怎么处理它?

你能帮帮我吗,因为它太复杂了,我做错了。我更改了列的名称(用于加密敏感数据)

这是 SAS 代码:

proc sql;
   create table &work_lib..opk_do_inf_4 as 
   select distinct         
            *,
            min(kat_opk) as opk_do_inf,
            count(nr_ks) as ilsc_opk_do_kosztu_infr
from &work_lib..opk_do_inf_3
group by kod_ow, kod_sw, nr_ks, nr_ks_pr, nazwa_zabiegu_icd_9, nazwa_zabiegu
having kat_opk = opk_do_inf
;
quit;

这是我在 Pandas 中的尝试:

df = self.opk_do_inf_3() -> create DF using other function
df['opk_do_inf'] = df.groupby(by=['kod_ow', 'kod_sw', 'nr_ks', 'nr_ks_pr', 'nazwa_zabiegu_icd_9', 'nazwa_zabiegu'])['kat_opk'].min()
df['ilsc_opk_do_kosztu_infr'] = df.groupby(by=['kod_ow', 'kod_sw', 'nr_ks', 'nr_ks_pr', 'nazwa_zabiegu_icd_9', 'nazwa_zabiegu'])['nr_ks'].count()
df_groupby = df.groupby(by=['kod_ow', 'kod_sw', 'nr_ks', 'nr_ks_pr', 'nazwa_zabiegu_icd_9', 'nazwa_zabiegu']).filter(lambda x: x['kat_opk']==x['opk_do_inf'])
df = df_groupby.reset_index()
df = df.drop_duplcates()
return df

【问题讨论】:

  • 是否希望按照 SAS 的方式将计算出的 MIN() 和 COUNT() 值重新合并到所有详细观察结果中?还是您只想每个 BY 组进行一次观察?

标签: python sql count sas pandas-groupby


【解决方案1】:

首先,在聚合 GROUP BY 查询中调用 SELECT * 不是有效的 SQL。 SAS 可能允许它,但会产生未知的结果。通常SELECT 列应限制为GROUP BY 子句中的列。

话虽如此,聚合 SQL 查询通常可以在 Pandas 中使用groupby.agg() 操作和WHERE(聚合前过滤)或HAVING(聚合后过滤)条件进行转换,使用.locquery 处理条件.

SQL

SELECT col1, col2, col3, 
       MIN(col1) AS min_col1,
       AVG(col2) AS mean_col2, 
       MAX(col3) AS max_col3, 
       COUNT(*)  AS count_obs

FROM mydata
GROUP BY col1, col2, col3
HAVING col1 = min(col1)

熊猫

一般

agg_data = (mydata.groupby(["col1", "col2", "col3"], as_index=False)
                  .agg(min_col1 = ("col1", "min"),
                       mean_col2 = ("col2", "mean"),
                       max_col3 = ("col3", "max"),
                       count_obs = ("col1", "count"))
                  .query("col1 == min_col1")
           )

具体

opk_do_inf_4 = (mydata.groupby(["kat_opk", "kod_ow", "kod_sw", "nr_ks", "nr_ks_pr", 
                                "nazwa_zabiegu_icd_9", "nazwa_zabiegu"], 
                                as_index=False)
                      .agg(opk_do_inf = ("kat_opk", "min"),
                           ilsc_opk_do_kosztu_infr = ("nr_ks", "count"))
                      .query("kat_opk == opk_do_inf")
               )

【讨论】:

    【解决方案2】:

    您可以使用 pandasql 包中的 sqldf 函数在数据帧上运行 sql 查询。下面的例子

    ''' 从 pandasql 导入 sqldf 查询=“从df中选择前10名*” newdf = sqldf(查询,locals()) '''

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-17
      相关资源
      最近更新 更多