公衆號:尤而小屋
作者: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函數來實現降序排列
親愛的朋友,學會了嗎?