Pandas DataFrame DataFrame.groupby() 函数

Suraj Joshi 2023年1月30日
  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 时,索引就变成了自动生成的数字索引。

作者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

相关文章 - Pandas DataFrame