HOWTO · Pandas

Pandas で複数の列を分解する

このチュートリアルでは、Pandas で複数の列を分解する方法について説明します。

アクセスできるデータには、文字列から配列やリストまで、さまざまなデータ型を含めることができます。 通常、操作が簡単な数値 (整数と浮動小数点数) と文字列を好みます。

データフレーム セル内にリストがある場合、それらをどのように扱うのでしょうか? このトピックで説明する Pandas ライブラリで explode() 関数を使用できます。

explode() 関数を使用して Pandas で複数の列を分解する

explode() 関数 を使用すると、リスト要素を持つ Dataframe セルが行に変換され、インデックス値が複製され、展開されたリストを含む Dataframe が返されます。 explode() 関数を使用する前に、リスト要素を含むデータフレームを作成しましょう。

コード例:

import pandas as pd
import numpy as np

df = pd.DataFrame(
    {
        "A": ["1", "2", "3", "4"],
        "B": [["11", "12"], ["13", "14"], ["15", "16"], ["17", "18"]],
        "C": [["31", "32"], ["33", "43"], ["56", "67"], ["78", "87"]],
        "D": [["41", "42"], ["34", "47"], ["55", "66"], ["77", "88"]],
        "E": [["51", "52"], ["35", "45"], ["56", "76"], ["97", "68"]],
    }
)

print(df)

出力:

    A         B         C         D         E
0  1  [11, 12]  [31, 32]  [41, 42]  [51, 52]
1  2  [13, 14]  [33, 43]  [34, 47]  [35, 45]
2  3  [15, 16]  [56, 67]  [55, 66]  [56, 76]
3  4  [17, 18]  [78, 87]  [77, 88]  [97, 68]

データフレームを分解するには、分解する必要がある column を渡す必要があります。 複数の列を展開できますが、1つの列 B から始めましょう。

print(df.explode("B"))

出力:

    A   B         C         D         E
0  1  11  [31, 32]  [41, 42]  [51, 52]
0  1  12  [31, 32]  [41, 42]  [51, 52]
1  2  13  [33, 43]  [34, 47]  [35, 45]
1  2  14  [33, 43]  [34, 47]  [35, 45]
2  3  15  [56, 67]  [55, 66]  [56, 76]
2  3  16  [56, 67]  [55, 66]  [56, 76]
3  4  17  [78, 87]  [77, 88]  [97, 68]
3  4  18  [78, 87]  [77, 88]  [97, 68]

ご覧のとおり、インデックスを複製し、リスト要素を分離してセルを作成します。 元のインデックスを使用したくない場合は、ignore_index パラメータを使用して新しいインデックスに置き換えることができます。

True に設定すると、元のインデックスが新しいインデックスに置き換えられます。

    A   B         C         D         E
0  1  11  [31, 32]  [41, 42]  [51, 52]
1  1  12  [31, 32]  [41, 42]  [51, 52]
2  2  13  [33, 43]  [34, 47]  [35, 45]
3  2  14  [33, 43]  [34, 47]  [35, 45]
4  3  15  [56, 67]  [55, 66]  [56, 76]
5  3  16  [56, 67]  [55, 66]  [56, 76]
6  4  17  [78, 87]  [77, 88]  [97, 68]
7  4  18  [78, 87]  [77, 88]  [97, 68]

複数の列に基づいてデータフレームを分解することもできます。

print(df.explode(["B", "C", "D", "E"], ignore_index=True))

出力:

    A   B   C   D   E
0  1  11  31  41  51
1  1  12  32  42  52
2  2  13  33  34  35
3  2  14  43  47  45
4  3  15  56  55  56
5  3  16  67  66  76
6  4  17  78  77  97
7  4  18  87  88  68

Series.explode を使用して Pandas で複数の列を分解する

Series.explode 関数 は pandas の explode() 関数と同じことを行い、関数と一緒に apply() 関数を使用してデータフレーム全体を爆発させることができます。 列に基づいてインデックスを設定し、explode() 関数を適用してから、reset_index() 関数を使用してインデックスをリセットできます。

print(df.set_index(["A"]).apply(pd.Series.explode).reset_index())

出力:

    A   B   C   D   E
0  1  11  31  41  51
1  1  12  32  42  52
2  2  13  33  34  35
3  2  14  43  47  45
4  3  15  56  55  56
5  3  16  67  66  76
6  4  17  78  77  97
7  4  18  87  88  68