首页 > 解决方案 > 如何根据多列对数据框进行分组并拆分一列?

问题描述

我有一个包含四列的数据集,我想根据其前三列对其数据进行分类,并计算第一列包含正值、零值或负值的次数。我还想为每个分类总结每个状态(正/零/负)中第 4 列的值。这是一个例子:

col1    col2    col3    col4
----------------------------
1       a       Jack    2
1       a       Jack    3
2       c       Joe     0
3       c       Joe     -1
3       a       Joe     1
1       a       Jack    -2

结果应如下所示:

col1    col2    col3    PCount  PSum   ZCount  ZSum   NCount  NSum
------------------------------------------------------------------
1       a       Jack    2       5      0       0      1       -2
2       c       Joe     0       0      1       0      0       0
3       c       Joe     0       0      0       0      1       -1
3       a       Joe     1       1      0       0      0       0

PCount and PSum是 (1 , a , Jack) 分别具有正值 incol4及其总和的次数。ZCount and ZSum分别包含 (1 , a , Jack) 的次数col4及其总和为零的次数。NCount and NSum分别显示 (1 , a , Jack) 具有正值的次数col4及其总和。其余行也是如此。

关于如何在 python(或者可能是 sqlite)中编码的任何建议?我的数据集相当大(+12M 行)。

(我在这里问过这个问题的类似版本,还提供了我的代码,但它不能正常工作!)

标签: pythonsqlite

解决方案


按 col1、col2、col3 分组后的条件聚合:

select col1, col2, col3,
  sum(col4 > 0) PCount,
  sum(case when col4 > 0 then col4 else 0 end) PSum,
  sum(col4 = 0) ZCount,
  0 ZSum,
  sum(col4 < 0) NCount,
  sum(case when col4 < 0 then col4 else 0 end) NSum
from tablename
group by col1, col2, col3

不需要计算ZSum,对吧?
请参阅演示
结果:

| col1 | col2 | col3 | PCount | PSum | ZCount | ZSum | NCount | NSum |
| ---- | ---- | ---- | ------ | ---- | ------ | ---- | ------ | ---- |
| 1    | a    | Jack | 2      | 5    | 0      | 0    | 1      | -2   |
| 2    | c    | Joe  | 0      | 0    | 1      | 0    | 0      | 0    |
| 3    | a    | Joe  | 1      | 1    | 0      | 0    | 0      | 0    |
| 3    | c    | Joe  | 0      | 0    | 0      | 0    | 1      | -1   |

推荐阅读