Pandas DataFrame 列で単一の列を複数の列に分割する

Luqman Khan 2022年4月14日
Pandas DataFrame 列で単一の列を複数の列に分割する

Pandas には、文字列列またはテキスト列をダッシュ​​、空白、およびリストの戻り列(シリーズ)で分割するためのよく知られた方法があります。Pandas について言えば、シリーズという用語はデータフレーム列と呼ばれます。

pandas Series.str.split() 関数を使用して、特定の区切り文字または区切り文字の周りの複数の列の文字列を分割できます。Python の文字列 split() メソッドに似ていますが、Dataframe 列全体に適用されます。以下の列を区切る最も簡単な方法があります。

このメソッドは、Series 文字列を初期インデックスから分離します。

Series.str.split(pat=None, n=-1, expand=False)

このメソッドの動作を理解してみましょう

# import Pandas as pd
import pandas as pd

# innitilize Dataframe
df = pd.DataFrame(
    {
        "Email": [
            "Alex.jhon@gmail.com",
            "Hamza.Azeez@gmail.com",
            "Harry.barton@hotmail.com",
        ],
        "Number": ["+44-3844556210", "+44-2245551219", "+44-1049956215"],
        "Location": ["Alameda,California", "Sanford,Florida", "Columbus,Georgia"],
    }
)
print("Dataframe series:\n", df)

E メール番号場所の 3つの列を持つデータフレーム df を作成しました。[電子メール]列の文字列には特定のパターンがあることに注意してください。ただし、よく見ると、この列は 2つの列に分割できます。必要な問題をうまく解決します。

出力:

Dataframe series :
                       Email          Number            Location
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia

Series.str.split() 関数を使用して Number 列を分離し、split() メソッドで - を渡します。必ず Trueexpand キーワードに渡してください。

例 1:

print(
    "\n\nSplit 'Number' column by '-' into two individual columns :\n",
    df.Number.str.split(pat="-", expand=True),
)

この例では、シリーズ(数値)のすべての値を - で分割します。

出力:

Split 'Number' column into two individual columns :
      0           1
0  +44  3844556210
1  +44  2245551219
2  +44  1049956215

展開パラメータ Series.str.split(expand=True) のみを使用する場合、これにより空白を分割できますが、-、または文字列に存在する場合は正規表現で区切ることはできません。pat パラメータ。

これらの分割列の名前を変更しましょう。

df[["Dialling Code", "Cell-Number"]] = df.Number.str.split("-", expand=True)
print(df)

2つの新しいシリーズダイヤルコードセル番号を作成し、番号シリーズを使用して値を割り当てました。

出力:

                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number  
0  3844556210  
1  2245551219  
2  1049956215  

例 2:

この例では、Location シリーズをで分割します。

df[["City", "State"]] = df.Location.str.split(",", expand=True)
print(df)

場所シリーズを分割し、その値を個々のシリーズ都市に保存します。

出力:

                      Email          Number            Location      City  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California   Alameda   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida   Sanford   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia  Columbus   

        State  
0  California  
1     Florida  
2     Georgia 

最後の例を見てみましょう。E メールシリーズでフルネームを分離します。

full_name = df.Email.str.split(pat="@", expand=True)
print(full_name)

出力:

              0            1
0     Alex.jhon    gmail.com
1   Hamza.Azeez    gmail.com
2  Harry.barton  hotmail.com

ここで、名前と名前をで区切ります。

df[["First Name", "Last Name"]] = full_name[0].str.split(".", expand=True)
print(df)

出力:

                      Email          Number            Location First Name  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California       Alex   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida      Hamza   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia      Harry   

  Last Name  
0      jhon  
1     Azeez  
2    barton 

.split() メソッドで expand=True が渡された場合、n=-1 パラメータは機能しません。

print(df["Email"].str.split("@", n=-1, expand=True))

出力:

        0           1
0  George  Washington
1   Hamza       Azeez
2   Harry      Walker

サンプルコード全体を以下に示します。

# import Pandas as pd
import pandas as pd

# create a new Dataframe
df = pd.DataFrame(
    {
        "Email": [
            "Alex.jhon@gmail.com",
            "Hamza.Azeez@gmail.com",
            "Harry.barton@hotmail.com",
        ],
        "Number": ["+44-3844556210", "+44-2245551219", "+44-1049956215"],
        "Location": ["Alameda,California", "Sanford,Florida", "Columbus,Georgia"],
    }
)

print("Dataframe series :\n", df)

print(
    "\n\nSplit 'Number' column by '-' into two individual columns :\n",
    df.Number.str.split(pat="-", expand=True),
)

df[["Dialling Code", "Cell-Number"]] = df.Number.str.split("-", expand=True)
print(df)

df[["City", "State"]] = df.Location.str.split(",", expand=True)
print(df)

full_name = df.Email.str.split(pat="@", expand=True)
print(full_name)

df[["First Name", "Last Name"]] = full_name[0].str.split(".", expand=True)
print(df)

出力:

Dataframe series :
                       Email          Number            Location
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia


Split 'Number' column by '-' into two individual columns :
      0           1
0  +44  3844556210
1  +44  2245551219
2  +44  1049956215
                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number  
0  3844556210  
1  2245551219  
2  1049956215  
                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number      City       State  
0  3844556210   Alameda  California  
1  2245551219   Sanford     Florida  
2  1049956215  Columbus     Georgia  
              0            1
0     Alex.jhon    gmail.com
1   Hamza.Azeez    gmail.com
2  Harry.barton  hotmail.com
                      Email          Number            Location Dialling Code  \
0       Alex.jhon@gmail.com  +44-3844556210  Alameda,California           +44   
1     Hamza.Azeez@gmail.com  +44-2245551219     Sanford,Florida           +44   
2  Harry.barton@hotmail.com  +44-1049956215    Columbus,Georgia           +44   

  Cell-Number      City       State First Name Last Name  
0  3844556210   Alameda  California       Alex      jhon  
1  2245551219   Sanford     Florida      Hamza     Azeez  
2  1049956215  Columbus     Georgia      Harry    barton 

関連記事 - Pandas DataFrame