簡體   English   中英

如何根據一個以上的列對數據幀進行分組並拆分一列?

[英]how to group a data frame based on more than one column and split one column?

我有一個包含四列的數據集,我想根據其前三列對其數據進行分類,並計算第一列包含正值,零值或負值的次數。 我還想總結每種分類在每種狀態(正/零/負)中第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分別是col4及其求和的次數(1,a,Jack)的正數。 ZCount and ZSum包含col4及其求和的次數(1,a,Jack)分別為零的col4 NCount and NSum顯示col4及其求和的次數(1,a,Jack)的正數。 其余行也是如此。

關於如何在python(或sqlite)中編寫代碼的任何建議? 我的數據集非常大(+1200萬行)。

(我在這里問過類似版本的問題並提供了我的代碼,該代碼無法正常工作!)

通過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   |

在撰寫本文時並沒有真正的用處,但即將發布的sqlite 3.30(當前處於beta版)支持FILTER子句以實現聚合函數,並允許類似

SELECT col1, col2, col3
     , count(col4) FILTER (WHERE col4 > 0) PCount
     , total(col4) FILTER (WHERE col4 > 0) PSum
     , count(col4) FILTER (WHERE col4 = 0) ZCount
     , 0 ZSum
     , count(col4) FILTER (WHERE col4 < 0) NCount
     , total(col4) FILTER (WHERE col4 < 0) NSum
FROM tablename
GROUP BY col1, col2, col3;

這比像現在那樣散布一堆CASE干凈得多。 total()是sqlite特定的函數,類似於sum()但在空的一組行上返回0而不是null )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM