首頁 > 軟體

pandas groupby 用法範例詳解

2022-11-25 14:01:04

專案github地址:bitcarmanlee easy-algorithm-interview-and-practice
歡迎大家star,留言,一起學習進步

1.分組groupby

在日常資料分析過程中,經常有分組的需求。具體來說,就是根據一個或者多個欄位,將資料劃分為不同的組,然後進行進一步分析,比如求分組的數量,分組內的最大值最小值平均值等。在sql中,就是大名鼎鼎的groupby操作。
pandas中,也有對應的groupby操作,下面我們就來看看pandas中的groupby怎麼使用。

2.groupby的資料結構

首先我們看如下程式碼

def ddd():
    levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
    nums = [10, 20, 30, 20, 15, 10, 12]
    df = pd.DataFrame({"level": levels, "num": nums})
    g = df.groupby('level')
    print(g)
    print()
    print(list(g))

輸出結果如下:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x10f6f96d0>

[('L1',   level  num
0    L1   10
1    L1   20
2    L1   30), ('L2',   level  num
3    L2   20
4    L2   15), ('L3',   level  num
5    L3   10
6    L3   12)]

做groupby操作以後,得到的是一個DataFrameGroupBy物件,直接列印該物件的話,顯示的是其記憶體地址。
為了方便地觀察資料,我們使用list方法轉換一下,發現其是一個元組,元組中的第一個元素,是level的值。元祖中的第二個元素,則是其組別下的整個dataframe。

3.groupby的基本用法

def group1():
    levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
    nums = [10, 20, 30, 20, 15, 10, 12]
    scores = [100, 200, 300, 200, 150, 100, 120]
    df = pd.DataFrame({"level": levels, "num": nums, "score": scores})
    result = df.groupby('level').agg({'num': 'sum', 'score': 'mean'})
    allnum = result['num'].sum()
    result['rate'] = result['num'].map(lambda x: x / allnum)
    print(result)

最後輸出:

       num  score      rate
level                      
L1      60    200  0.512821
L2      35    175  0.299145
L3      22    110  0.188034

上面的例子展示了groupby的基本用法。
對dataframe按照level分組,然後對num列求和,對score列求平均值,可以得到result。
同時,我們還希望得到每個分組中,num的和在所有num和中的佔比。於是我們先求num的綜合,然後在用map方法,給result新增一列,求得其佔比!

4.transform的用法

下面我們看一個更復雜的例子。

def t10():
    levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
    nums = [10, 20, 30, 20, 15, 10, 12]
    df = pd.DataFrame({"level": levels, "num": nums})
    ret = df.groupby('level')['num'].mean().to_dict()
    df['avg_num'] = df['level'].map(ret)
    print(ret)
    print(df)
{'L1': 20.0, 'L2': 17.5, 'L3': 11.0}
  level  num  avg_num
0    L1   10     20.0
1    L1   20     20.0
2    L1   30     20.0
3    L2   20     17.5
4    L2   15     17.5
5    L3   10     11.0
6    L3   12     11.0

上面的方法,我們對level分組以後,我們想給資料集新增一列,想給每行資料新增每個level對應的平均值。
上面的解法是先求得每個分組的平均值,轉成一個dict,然後再使用map方法將每組的平均值新增上去。

def trans():
    levels = ["L1", "L1", "L1", "L2", "L2", "L3", "L3"]
    nums = [10, 20, 30, 20, 15, 10, 12]
    df = pd.DataFrame({"level": levels, "num": nums})
    df['avg_num'] = df.groupby('level')['num'].transform('mean')
    print(df)

如果使用transform方法,程式碼可以更簡單更直觀,如上所示。

transform方法的作用:呼叫函數在每個分組上產生一個與原df相同索引的dataFrame,整體返回與原來物件擁有相同索引且已填充了轉換後的值的dataFrame,相當於就是給原來的dataframe新增了一列。

到此這篇關於pandas groupby 用法詳解的文章就介紹到這了,更多相關pandas groupby 用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com