Во-первых, вызов SELECT *
в агрегированном запросе GROUP BY
недействителен SQL. SAS может разрешить это, но может дать неизвестные результаты. Обычно столбцы SELECT
должны быть ограничены столбцами в предложении GROUP BY
.
С учетом сказанного, совокупные запросы SQL обычно можно преобразовать в Pandas с помощью groupby.agg()
операций с условиями WHERE
(фильтровать перед агрегацией) или HAVING
(фильтровать после агрегации), обрабатываемых с использованием либо .loc
, либо query
.
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)
Pandas
Общий
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")
)
Специфический c
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")
)