Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで2つ以上のPandas DataFrameを列方向に連結する方法

2つ以上のPandas DataFrameを連結したい場合には、concat()関数を使用します。列方向(横方向)に連結するには、axisパラメータにaxis=1を指定します。デフォルトのaxis=0は行方向(縦方向)の連結となるため、列方向に並べたい場合は必ず指定が必要です。

まず、必要なライブラリをインポートします。

import pandas as pd

1つ目のDataFrameを作成

dataFrame1 = pd.DataFrame(
    {
        "Col1": [10, 20, 30],
        "Col2": [40, 50, 60],
        "Col3": [70, 80, 90],
    },
    index=[0, 1, 2],
)

2つ目のDataFrameを作成

dataFrame2 = pd.DataFrame(
    {
        "Col1": [100, 110, 120],
        "Col2": [130, 140, 150],
        "Col3": [160, 170, 180],
    },
    index=[3, 4, 5],
)

3つ目のDataFrameを作成

dataFrame3 = pd.DataFrame(
    {
        "Col1": [200, 210, 220],
        "Col2": [230, 240, 250],
        "Col3": [260, 270, 280],
    },
    index=[6, 7, 8],
)

3つのDataFrameを列方向に連結する

作成した3つのDataFrameをリストにまとめ、pd.concat()に渡して「axis=1」を指定することで、列方向に連結できます。

res = [dataFrame1, dataFrame2, dataFrame3]
result = pd.concat(res, axis=1)

完全なサンプルコード

以下が全体のコードです。

import pandas as pd

# DataFrame1を作成
dataFrame1 = pd.DataFrame(
    {
        "Col1": [10, 20, 30],
        "Col2": [40, 50, 60],
        "Col3": [70, 80, 90],
    },
    index=[0, 1, 2],
)
print("DataFrame1...\n", dataFrame1)

# DataFrame2を作成
dataFrame2 = pd.DataFrame(
    {
        "Col1": [100, 110, 120],
        "Col2": [130, 140, 150],
        "Col3": [160, 170, 180],
    },
    index=[3, 4, 5],
)
print("DataFrame2...\n", dataFrame2)

# DataFrame3を作成
dataFrame3 = pd.DataFrame(
    {
        "Col1": [200, 210, 220],
        "Col2": [230, 240, 250],
        "Col3": [260, 270, 280],
    },
    index=[6, 7, 8],
)
print("DataFrame3...\n", dataFrame3)

# 3つのDataFrameを列方向に連結(axis=1を指定)
res = [dataFrame1, dataFrame2, dataFrame3]
print("\n3つのDataFrameを列方向に連結した結果...\n", pd.concat(res, axis=1))

実行結果

上記のコードを実行すると、以下のような出力が得られます。

DataFrame1...
    Col1  Col2  Col3
0   10    40    70
1   20    50    80
2   30    60    90
DataFrame2...
    Col1  Col2  Col3
3   100   130   160
4   110   140   170
5   120   150   180
DataFrame3...
    Col1  Col2  Col3
6   200   230   260
7   210   240   270
8   220   250   280

3つのDataFrameを列方向に連結した結果...
    Col1  Col2  Col3  Col1  Col2  Col3  Col1  Col2  Col3
0  10.0  40.0  70.0   NaN   NaN   NaN   NaN   NaN   NaN
1  20.0  50.0  80.0   NaN   NaN   NaN   NaN   NaN   NaN
2  30.0  60.0  90.0   NaN   NaN   NaN   NaN   NaN   NaN
3   NaN   NaN   NaN  100.0 130.0 160.0   NaN   NaN   NaN
4   NaN   NaN   NaN  110.0 140.0 170.0   NaN   NaN   NaN
5   NaN   NaN   NaN  120.0 150.0 180.0   NaN   NaN   NaN
6   NaN   NaN   NaN   NaN   NaN   NaN  200.0 230.0 260.0
7   NaN   NaN   NaN   NaN   NaN   NaN  210.0 240.0 270.0
8   NaN   NaN   NaN   NaN   NaN   NaN  220.0 250.0 280.0

ポイント:NaNが発生する理由と対処法

出力結果を見ると、多くのセルがNaN(欠損値)になっています。これは、各DataFrameのインデックスが異なるためです。axis=1で列方向に連結する場合、Pandasはインデックスを基準に行を揃えます。そのため、インデックスが一致しない行には自動的にNaNが挿入されます。

もしNaNを発生させずに単純に横へ並べたい場合は、ignore_index=Trueを指定してインデックスを振り直す方法があります。

result = pd.concat(res, axis=1, ignore_index=True)

このようにpd.concat()を使えば、2つどころか3つ以上の任意の数のDataFrameも簡単に連結できるので、データ前処理の際にぜひ活用してください。

  1. Pythonで2つの辞書を比較する方法:==演算子と共通項目の抽出

    Pythonにおいて、辞書(dict型)もクラスの一種です。dictクラスでは__eq__メソッドがオーバーライドされているため、==演算子を使うだけで、2つの辞書が等しいかどうかを簡単に確認できます。例:==演算子で辞書を比較するa = {foo: 10, bar: 150} b = {foo: 10, bar: 150} print(a == b)出力結果Trueキーと値のペアがすべて一致していればTrueが返されます。なお、辞書の比較では要素の並び順は影響しないため、順序が異なっていても中身が同じであれば等しいと判定されます。2つの辞書の共通項目を取得する方法2つの辞書に共通して存在する

  2. Pythonで2つのタプルを比較するにはどうすればよいですか?

    Pythonでは、タプルは辞書式順序(lexicographical order)で比較されます。まず最初のタプルの1番目の要素と2番目のタプルの1番目の要素が比較され、等しくなければその時点で比較結果が確定します。等しい場合は2番目の要素、次に3番目の要素…というように、順番に比較が進んでいきます。例:タプル同士の大小比較>>> a = (1, 2, 3) >>> b = (1, 2, 5) >>> a < b Trueこの例では、最初の2つの要素(1と2)はどちらのタプルでも等しいため、比較は3番目の要素に進みます。「3 <