[英]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.