使用Pandas實現SQL的group_concat功能

公衆號:尤而小屋
作者:Peter
編輯:Peter

大家好,我是Peter~

本文是對比SQL學習Pandas的第三篇文章,主要講解的是如何利用pandas來實現SQL中的group_concat操作。

group_concat

SQL或者MySQL中的group_concat到底實現的什麼功能呢?看例子來說明。

下面是表information中存儲的一份簡單數據,兩個字段id和name:

+----+-----+
| id | name |
+------+---+
|1  | 10   |
|1  | 20   |
|1  | 20   |
|2  | 20   |
|3  | 200  |
|3  | 500  |

方式1:默認情形

我們以id來進行分組,將name放在同一行,同時用逗號隔開:

select 
    id
    ,group_concat(name)  as name
from information 
group by id;

結果爲:

|id|  name|
|1 |10,20,20|
|2 |20      |
|3 |200,500|

方式2:指定符號

上面的結果中默認是逗號(英文逗號)隔開的,我們還可以自己指定符號:

select 
    id
    ,group_concat(name separator ';')  as name
from information 
group by id;

結果則顯示爲:

|id|  name|
|1 |10;20;20|   -- 分號隔開
|2 |20      |
|3 |200;500|

方式3: 去重顯示

我們還可以以id分組,將冗餘(重複的)的數據去掉,然後將剩下的放在一起;比如id=1的數據重複了20,我們希望只顯示一個20:

加上了關鍵詞distinct :

select 
    id
    ,group_concat(distinct name)  as name
from information 
group by id;

相應的結果顯示爲:

|id|  name|
|1 |10,20|   -- 只顯示了一個20
|2 |20    |
|3 |200,500|

方式4:降序排列

在上面的全部情形中,數據都是升序排列,我們還可以降序:

select 
    id
    ,group_concat(name order by name desc)  as name  
from information 
group by id;

那麼顯示的結果爲:

-- 結果已經降序排列了

|id|  name|
|1 |20,20,10|
|2 |20    |
|3 |500,200|

上面介紹的就是各種group_concat實現的效果,下面利用pandas來實現。

模擬數據

import pandas as pd
import numpy as np
df = pd.DataFrame({
  "name":["小明","小明","小明","小紅","小張","小張"],
  "score":[10,20,20,20,200,500]
})

df

很清楚,我們需要將小明、小紅、小張的score分組放在一起。

方式1:默認分組

實現默認分組情形,升序排列且不去重。主要是3個步驟:

1、通過groupby進行分組

2、分組之後通過list將score全部放在一個列表中

3、第三步只是進行了索引重排

方式2:指定符號

指定特定的符號,我們使用的join函數。因爲這個函數只能操作字符串,所以我們需要將df中的數值型數據轉成字符串:

df.astype(str)

方式3:去重顯示

通過name字段進行分組,再對score採用unique函數。下面只是進行所以重排

方式4:降序排列

1、我們先實現默認的升序排列

2、對score字段再次使用apply函數,通過對列表使用sorted函數來實現降序排列

親愛的朋友,學會了嗎?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章