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

Pythonで既存のPandas DataFrameに辞書のリストを追加する方法

Pandasでは、辞書のリストを既存のDataFrameに追加することで、複数の行データをまとめて結合できます。かつては append() メソッドがよく使われていましたが、このメソッドはPandas 1.4で非推奨となり、2.0で削除されました。現在は pd.concat() を使うのが標準的な方法です。本記事では、両方のアプローチを含めて手順を解説します。

1. 元となるDataFrameを作成する

まず、車種・地域・販売台数を含む基本的なDataFrameを作成します。

import pandas as pd

dataFrame = pd.DataFrame(
    {
        "Car": ['BMW', 'Audi', 'XUV', 'Lexus', 'Volkswagen'],
        "Place": ['Delhi', 'Bangalore', 'Pune', 'Chandigarh', 'Mumbai'],
        "Units": [100, 150, 50, 110, 90]
    }
)
print("DataFrame ...\n", dataFrame)

2. 追加する辞書のリストを作成する

次に、DataFrameに追加したい行データを辞書のリストとして定義します。各辞書のキーは、既存のDataFrameの列名と対応させておくのがポイントです。

d = [
    {'Car': 'Mustang', 'Place': 'Hyderabad', 'Units': 60},
    {'Car': 'Tesla', 'Place': 'Kerala', 'Units': 30},
    {'Car': 'RollsRoyce', 'Place': 'Punjab', 'Units': 70},
    {'Car': 'Bentley', 'Place': 'Gujarat', 'Units': 80}
]
print("\nDictionary....\n", d)

3. 辞書のリストをDataFrameに追加する

旧バージョン(Pandas 1.3以前)の書き方

以前は append() を使って以下のように記述していました。ただし、このメソッドは現在利用できませんので注意してください。

# ※非推奨:Pandas 2.0以降では削除済み
dataFrame = dataFrame.append(d, ignore_index=True, sort=False)

現行バージョンでの推奨される書き方(pd.concat)

現在のPandasでは、辞書のリストから一時的なDataFrameを作成し、pd.concat() で連結するのが推奨される方法です。

dataFrame = pd.concat([dataFrame, pd.DataFrame(d)], ignore_index=True)

ignore_index=True を指定すると、連結後のインデックスが0から振り直されます。これを指定しないとインデックスが重複してしまうため、通常は指定しておくのが安全です。

完全なサンプルコード

import pandas as pd

# 元となるDataFrameを作成
dataFrame = pd.DataFrame(
    {
        "Car": ['BMW', 'Audi', 'XUV', 'Lexus', 'Volkswagen'],
        "Place": ['Delhi', 'Bangalore', 'Pune', 'Chandigarh', 'Mumbai'],
        "Units": [100, 150, 50, 110, 90]
    }
)
print("DataFrame ...\n", dataFrame)

# 追加用の辞書のリストを作成
d = [
    {'Car': 'Mustang', 'Place': 'Hyderabad', 'Units': 60},
    {'Car': 'Tesla', 'Place': 'Kerala', 'Units': 30},
    {'Car': 'RollsRoyce', 'Place': 'Punjab', 'Units': 70},
    {'Car': 'Bentley', 'Place': 'Gujarat', 'Units': 80}
]
print("\nDictionary....\n", d)

# 辞書のリストを既存のDataFrameに連結
dataFrame = pd.concat([dataFrame, pd.DataFrame(d)], ignore_index=True)

# 結果を表示
print("\nResult of concat...\n", dataFrame)

実行結果

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

DataFrame ...
          Car      Place  Units
0         BMW      Delhi    100
1        Audi  Bangalore    150
2         XUV       Pune     50
3       Lexus Chandigarh    110
4  Volkswagen     Mumbai     90

Dictionary....
[{'Car': 'Mustang', 'Place': 'Hyderabad', 'Units': 60}, {'Car': 'Tesla', 'Place': 'Kerala', 'Units': 30}, {'Car': 'RollsRoyce', 'Place': 'Punjab', 'Units': 70}, {'Car': 'Bentley', 'Place': 'Gujarat', 'Units': 80}]

Result of concat...
          Car      Place  Units
0         BMW      Delhi    100
1        Audi  Bangalore    150
2         XUV       Pune     50
3       Lexus Chandigarh    110
4  Volkswagen     Mumbai     90
5     Mustang  Hyderabad     60
6       Tesla     Kerala     30
7  RollsRoyce     Punjab     70
8     Bentley    Gujarat     80

補足:知っておくと便利なポイント

  • 列名が一致しない場合: 辞書のキーが既存のDataFrameの列名と一致しない場合でもエラーにはなりませんが、その部分は欠損値(NaN)として埋められます。
  • パフォーマンスについて: ループ内でDataFrameへの追加を繰り返すのは非効率です。可能であれば、すべてのデータをリストに集めてから一度だけ pd.concat() を呼び出すようにしましょう。
  • sort引数について:append()sort=False は列の並び順を維持するためのものでした。pd.concat() ではデフォルトで最初のDataFrameの列順が保持されます。

このように、辞書のリストを活用すれば、構造化された新規データを既存のDataFrameへ柔軟に追加できます。環境によっては append() のコード例がまだ多く見られますが、今後の開発では pd.concat() を使うようにしましょう。

  1. 【Python】Pandas DataFrameからサブセット(列の一部)を選択する方法

    Pandas DataFrameのサブセット選択とは? Pandasでは、DataFrameから必要な列や行だけを取り出す操作を「サブセットの選択」と呼びます。大きなデータセットから目的のデータだけを抽出できれば、分析や前処理の効率が大幅に向上します。 この記事では、CSVファイルを読み込んだDataFrameから、1つの列、および複数の列を選択する基本的な方法を解説します。 使用するCSVファイルの内容 今回使用する「SalesData.csv」は、Microsoft Excelで開くと以下のような内容になっています。 CSVファイルからDataFrameを作成する まず、pd.rea

  2. Pandasで既存のDataFrameに新しい列を追加する3つの方法

    はじめにこのチュートリアルでは、Pythonのデータ分析ライブラリ「pandas」において、既存のDataFrameに新しい列を追加する方法を解説します。新しい列を追加するアプローチは複数あり、それぞれに特徴があります。ここでは代表的な3つの方法を、コード例と実行結果とともに順番に見ていきましょう。方法1:リストを使って追加する最もシンプルなのが、Pythonのリストをそのまま列として代入する方法です。以下の手順で行います。手順辞書を使ってDataFrameを作成する。新しい列のデータを含むリストを作成する。リストの長さが、すでにDataFrame内にあるデータの行数と一致している必要がある点