Pandas DataFrame DataFrame.groupby()関数

Suraj Joshi 2023年1月30日
  1. pandas.DataFrame.groupby() の構文:
  2. コード例:単一の列の値に基づいて 2つの DataFrame を pandas.DataFrame.groupby() でグループ化する
  3. コード例:複数の条件に基づいて、pandas.DataFrame.groupby() で 2つの DataFrame をグループ化する
  4. コード例:pandas.DataFrame.groupby()as_index=False を設定
Pandas DataFrame DataFrame.groupby()関数

pandas.DataFrame.groupby() は、指定された基準に基づいて DataFrame をグループに分割します。groupby() メソッドを使用して、大きなデータセットを簡単に操作できます。

pandas.DataFrame.groupby() の構文:

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

パラメーター

by 要素をグループ化するためのマッピング、関数、文字列、ラベルまたは反復可能
axis row(axis = 0)または column(axis = 1)とともにグループ化
level 整数。特定のレベルでグループ化する値
as_index ブール。インデックスとしてグループラベルを持つオブジェクトを返します
sort ブール。グループキーをソートします
group_keys グループを識別するためにグループキーをインデックスに追加します
squeeze ブール。可能であれば、リターンの次元を減らします
observed ブール。いずれかのグループがカテゴリカルである場合にのみ適用され、True に設定されている場合、カテゴリグループの観測値のみを表示します。

戻り値

グループ化された情報を含む DataFrameGroupBy オブジェクトを返します。

コード例:単一の列の値に基づいて 2つの DataFrame を pandas.DataFrame.groupby() でグループ化する

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

In_Stock 列の値がはいである df のすべての要素を出力します。まず、groubpy() メソッドを使用して、In_Stock 列の値が異なる要素を個別のグループにグループ化し、次に、get_group() メソッドを使用して特定のグループにアクセスします。

コード例:複数の条件に基づいて、pandas.DataFrame.groupby() で 2つの 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

dfIn_StockSupplier 列の値に基づいてグループにグループ化し、DataFrameGroupBy オブジェクトを返します。

各グループの最初の要素を取得するには、first() メソッドを使用します。次の 4つのグループの最初の要素の組み合わせによって形成される DataFrame を返します。

  • In_Stock 列の NoSupplier 列の値が ABC のグループ。
  • In_Stock 列の NoSupplier 列の値が XYZ のグループ。
  • In_Stock 列の YesSupplier 列の値が ABC のグループ。
  • In_Stock 列の YesSupplier 列の値が XYZ のグループ。

複数のラベルを 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')

ご覧のとおり、デフォルトでは as_index=True であるため、生成された DataFrame のインデックスはグループラベルです。

インデックスは、as_index=False を設定すると、自動的に生成されたインデックスになります。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

関連記事 - Pandas DataFrame