Pandas DataFrame DataFrame.groupby() 函式

Suraj Joshi 2023年1月30日 2020年6月17日
  1. pandas.DataFrame.groupby() 語法
  2. 示例程式碼:使用 pandas.DataFrame.groupby() 根據單列的值對兩個 DataFrame 進行分組
  3. 示例程式碼:使用 pandas.DataFrame.groupby() 根據多個條件對兩個 DataFrame 進行分組
  4. 示例程式碼:在 pandas.DataFrame.groupby() 中設定 as_index=False
Pandas DataFrame DataFrame.groupby() 函式

pandas.DataFrame.groupby() 將一個 DataFrame 作為輸入,根據給定的標準將 DataFrame 分成若干組。我們可以使用 groupby() 方法輕鬆處理大型資料集。

pandas.DataFrame.groupby() 語法

DataFrame.groupby(
                 by=None, 
                 axis=0, 
                 level=None, 
                 as_index = True, 
                 sort = True, 
                 group_keys = True, 
                 squeeze: bool = False, 
                 observed: bool = False) 

引數

by 對映、函式、字串、標籤或可迭代的元素組
axis 按行(axis=0)或列(axis=1)來分組
level 整數,按特定級別進行分組的數值
as_index 布林型。它返回一個以組標籤為索引的物件
sort 布林型。它對組鍵進行排序
group_keys 布林型。它將組鍵新增到索引中,以識別分組
squeeze 布林型。在可能的情況下,它會減少返回的維度
observed 布林型。只適用於任何分類分組,如果設定為 True,則只顯示分類分組的觀測值

返回值

它返回一個 DataFrameGroupBy 物件,該物件中包含了組的資訊。

示例程式碼:使用 pandas.DataFrame.groupby() 根據單列的值對兩個 DataFrame 進行分組

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ) ,
             ('Mango', 24, 'No' ) ,
             ('banana', 14, 'No' ) ,
             ('Apple', 44, 'Yes' ) ,
             ('Pineapple', 64, 'No') ,
             ('Kiwi', 84, 'Yes')  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock']) 
grouped_df = df.groupby('In_Stock')
print(grouped_df)
print(type(grouped_df))

輸出:

<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f73cc992d30>
<class 'pandas.core.groupby.generic.DataFrameGroupBy'>

它根據 In_Stock 列中的值將 DataFrame 分組,並返回一個 DataFrameGroupBy 物件。

要想獲得 groupby() 返回的 DataFrameGroupBy 物件的詳細資訊,我們可以使用 DataFrameGroupBy 物件的 first() 方法來獲得每個組的第一個元素。

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ) ,
             ('Mango', 24, 'No' ) ,
             ('banana', 14, 'No' ) ,
             ('Apple', 44, 'Yes' ) ,
             ('Pineapple', 64, 'No') ,
             ('Kiwi', 84, 'Yes')  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock']) 
grouped_df = df.groupby('In_Stock')
print(grouped_df.first())

輸出:

            Name  Price
In_Stock               
No         Mango     24
Yes       Orange     34

它列印由從 df 分割的兩個組的第一個元素組成的 DataFrame

我們也可以使用 get_group() 方法列印整個組。

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ) ,
             ('Mango', 24, 'No' ) ,
             ('banana', 14, 'No' ) ,
             ('Apple', 44, 'Yes' ) ,
             ('Pineapple', 64, 'No') ,
             ('Kiwi', 84, 'Yes')  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock']) 
grouped_df = df.groupby('In_Stock')
print(grouped_df.get_group('Yes'))

輸出:

     Name  Price In_Stock
0  Orange     34      Yes
3   Apple     44      Yes
5    Kiwi     84      Yes

它列印的是 df 中所有在 In_Stock 列中值為 Yes 的元素。我們首先通過 groubpy() 方法將 In_Stock 列值不同的元素分成不同的組,然後使用 get_group() 方法訪問某個特定的組。

示例程式碼:使用 pandas.DataFrame.groupby() 根據多個條件對兩個 DataFrame 進行分組

import pandas as pd
fruit_list = [ ('Orange', 34, 'Yes' ,'ABC') ,
             ('Mango', 24, 'No','ABC' ) ,
             ('banana', 14, 'No','ABC' ) ,
             ('Apple', 44, 'Yes',"XYZ" ) ,
             ('Pineapple', 64, 'No',"XYZ") ,
             ('Kiwi', 84, 'Yes',"XYZ")  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock',"Supplier"]) 
grouped_df = df.groupby(['In_Stock', 'Supplier']) 
  
print(grouped_df.first())

輸出:

                        Name  Price
In_Stock Supplier                  
No       ABC           Mango     24
         XYZ       Pineapple     64
Yes      ABC          Orange     34
         XYZ           Apple     44

它根據 In_StockSupplier 列中的數值將 df 分組,並返回一個 DataFrameGroupBy 物件。

我們使用 first() 方法來獲取每個組的第一個元素。它返回一個由以下四個組的第一個元素組合而成的 DataFrame。

  • In_StockNoSupplierABC 值的組。
  • In_StockNoSupplierXYZ 值的組。
  • In_StockYesSupplierABC 值的組。
  • In_StockYesSupplierXYZ 值的組。

當我們將多個標籤傳遞給 groupby() 函式時,由 GroupBy 物件的方法返回的 DataFrame 有一個 MultiIndex

print(grouped_df.first().index)

輸出:

MultiIndex(levels=[['No', 'Yes'], ['ABC', 'XYZ']],
           labels=[[0, 0, 1, 1], [0, 1, 0, 1]],
           names=['In_Stock', 'Supplier'])

示例程式碼:在 pandas.DataFrame.groupby() 中設定 as_index=False

DataFrame.groupby() 方法中的 as_index 引數預設為 True。當應用 first()GroupBy 方法時,組標籤是返回的 DataFrame 的索引。

import pandas as pd

fruit_list = [ ('Orange', 34, 'Yes' ) ,
             ('Mango', 24, 'No' ) ,
             ('banana', 14, 'No' ) ,
             ('Apple', 44, 'Yes' ) ,
             ('Pineapple', 64, 'No') ,
             ('Kiwi', 84, 'Yes')  ]

df = pd.DataFrame(fruit_list, columns = ['Name' , 'Price', 'In_Stock']) 

grouped_df = df.groupby('In_Stock', as_index=True)

firtGroup = grouped_df.first()
print(firtGroup)
print(firtGroup.index)

print('---------')

grouped_df = df.groupby('In_Stock', as_index=False)

firtGroup = grouped_df.first()
print(firtGroup)
print(firtGroup.index)

輸出:

            Name  Price
In_Stock               
No         Mango     24
Yes       Orange     34
Index(['No', 'Yes'], dtype='object', name='In_Stock')  In_Stock    Name  Price
0       No   Mango     24
1      Yes  Orange     34
Int64Index([0, 1], dtype='int64')

正如你所看到的,生成的 DataFrame 的索引預設為組標籤,即 as_index=True

當我們設定 as_index=False 時,索引就變成了自動生成的數字索引。

Author: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn

相關文章 - Pandas DataFrame