Pandas の DataFrame を分割する

Suraj Joshi 2023年1月30日
  1. 行インデックスを使った DataFrame の分割
  2. groupby() メソッドを用いた DataFrame の分割
  3. sample() メソッドを用いた DataFrame の分割
Pandas の DataFrame を分割する

このチュートリアルでは、行インデックス、DataFrame.groupby() メソッド、DataFrame.sample() メソッドを用いて、DataFrame を複数の小さな DataFrame に分割する方法を説明します。

以下の apprix_df DataFrame を用いて、DataFrame を複数の小さな DataFrame に分割する方法を説明します。

import pandas as pd

apprix_df = pd.DataFrame(
    {
        "Name": ["Anish", "Rabindra", "Manish", "Samir", "Binam"],
        "Post": ["CEO", "CTO", "System Admin", "Consultant", "Engineer"],
        "Qualification": ["MBA", "MS", "MCA", "PhD", "BE"],
    }
)

print("Apprix Team DataFrame:")
print(apprix_df, "\n")

出力:

Apprix Team DataFrame:
       Name          Post Qualification
0     Anish           CEO           MBA
1  Rabindra           CTO            MS
2    Manish  System Admin           MCA
3     Samir    Consultant           PhD
4     Binam      Engineer            BE

行インデックスを使った DataFrame の分割

import pandas as pd

apprix_df = pd.DataFrame(
    {
        "Name": ["Anish", "Rabindra", "Manish", "Samir", "Binam"],
        "Post": ["CEO", "CTO", "System Admin", "Consultant", "Engineer"],
        "Qualification": ["MBA", "MS", "MCA", "PhD", "BE"],
    }
)

print("Apprix Team DataFrame:")
print(apprix_df, "\n")

apprix_1 = apprix_df.iloc[:2, :]
apprix_2 = apprix_df.iloc[2:, :]

print("The DataFrames formed by splitting of Apprix Team DataFrame are: ", "\n")
print(apprix_1, "\n")
print(apprix_2, "\n")

出力:

Apprix Team DataFrame:
       Name          Post Qualification
0     Anish           CEO           MBA
1  Rabindra           CTO            MS
2    Manish  System Admin           MCA
3     Samir    Consultant           PhD
4     Binam      Engineer            BE

The DataFrames formed by splitting the Apprix Team DataFrame are:

       Name Post Qualification
0     Anish  CEO           MBA
1  Rabindra  CTO            MS

     Name          Post Qualification
2  Manish  System Admin           MCA
3   Samir    Consultant           PhD
4   Binam      Engineer            BE

DataFrame apprix_df を行インデックスを用いて 2つの部分に分割します。最初の部分には apprix_df DataFrame の最初の 2 行が含まれ、2 番目の部分には最後の 3 行が含まれます。

各分割に含める行を iloc プロパティで指定することができます。[:2,:] は、インデックス 2 が排他的に指定された行までの行を選択します (インデックス 2 が指定された行は含まれません)。したがって、apprix_df.iloc[:2,:] は、DataFrame apprix_df の最初の 2 行をインデックス 01 で選択します。

groupby() メソッドを用いた DataFrame の分割

import pandas as pd

apprix_df = pd.DataFrame(
    {
        "Name": ["Anish", "Rabindra", "Manish", "Samir", "Binam"],
        "Post": ["CEO", "CTO", "System Admin", "Consultant", "Engineer"],
        "Qualification": ["MBA", "MS", "MS", "PhD", "MS"],
    }
)

print("Apprix Team DataFrame:")
print(apprix_df, "\n")

groups = apprix_df.groupby(apprix_df.Qualification)
ms_df = groups.get_group("MS")
mba_df = groups.get_group("MBA")
phd_df = groups.get_group("PhD")

print("Group with Qualification MS:")
print(ms_df, "\n")

print("Group with Qualification MBA:")
print(mba_df, "\n")

print("Group with Qualification PhD:")
print(phd_df, "\n")

出力:

Apprix Team DataFrame:
       Name          Post Qualification
0     Anish           CEO           MBA
1  Rabindra           CTO            MS
2    Manish  System Admin            MS
3     Samir    Consultant           PhD
4     Binam      Engineer            MS

Group with Qualification MS:
       Name          Post Qualification
1  Rabindra           CTO            MS
2    Manish  System Admin            MS
4     Binam      Engineer            MS

Group with Qualification MBA:
    Name Post Qualification
0  Anish  CEO           MBA

Group with Qualification PhD:
    Name        Post Qualification
3  Samir  Consultant           PhD

DataFrame apprix_dfQualification カラムの値に基づいて 3つの部分に分割します。Qualification カラムの値が同じ行は同じグループに配置されます。

関数 groupby()Qualification カラムの値に基づいてグループを形成します。そして、groupby() メソッドでグループ化された行を get_group() メソッドで抽出します。

sample() メソッドを用いた DataFrame の分割

DataFrame から sample() メソッドを用いてランダムに行をサンプリングすることで、DataFrame を形成することができます。親の DataFrame からサンプリングする行の比率を設定することができます。

import pandas as pd

apprix_df = pd.DataFrame(
    {
        "Name": ["Anish", "Rabindra", "Manish", "Samir", "Binam"],
        "Post": ["CEO", "CTO", "System Admin", "Consultant", "Engineer"],
        "Qualification": ["MBA", "MS", "MS", "PhD", "MS"],
    }
)

print("Apprix Team DataFrame:")
print(apprix_df, "\n")

random_df = apprix_df.sample(frac=0.4, random_state=60)

print("Random split from the Apprix Team DataFrame:")
print(random_df)

出力:

Apprix Team DataFrame:
       Name          Post Qualification
0     Anish           CEO           MBA
1  Rabindra           CTO            MS
2    Manish  System Admin            MS
3     Samir    Consultant           PhD
4     Binam      Engineer            MS

Random split from the Apprix Team DataFrame:
    Name      Post Qualification
0  Anish       CEO           MBA
4  Binam  Engineer            MS

apprix_df DataFrame から行の 40%をランダムにサンプリングし、サンプリングされた行から形成された DataFrame を表示します。random_state は、サンプリング時に毎回同じランダムサンプルが得られるように設定されています。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

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

LinkedIn

関連記事 - Pandas DataFrame