Pandas

[Python] Pandas – DataFrameに行・列を追加する方法

PandasのDataFrameに行や列を追加する方法は以下の通りです。

行を追加するには、locappendメソッドを使用します。

locは特定のインデックスに直接行を追加でき、appendは新しい行を既存のDataFrameに結合しますが、appendは非推奨となり、concatの使用が推奨されています。

列を追加するには、DataFrame['新しい列名'] = 値の形式で新しい列を定義します。

値はリストや他の列の計算結果などが使用可能です。

DataFrameに行・列を追加する基本操作

PandasのDataFrameは、データを表形式で扱うための非常に便利な構造です。

ここでは、DataFrameに行や列を追加する基本的な方法について解説します。

DataFrameに行を追加する方法

DataFrameに行を追加する方法はいくつかあります。

以下に代表的な方法を紹介します。

locを使った行の追加

locを使用すると、特定のインデックスに行を追加できます。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい行を追加
df.loc[2] = ['佐藤', 25]
print(df)
名前  年齢
0  田中  28
1  鈴木  34
2  佐藤  25

locを使うことで、指定したインデックスに新しい行を追加することができます。

appendメソッドを使った行の追加(非推奨)

appendメソッドを使って行を追加することもできますが、Pandasのバージョン1.4.0以降では廃止されています。

以下はその例ですが、バージョン1.4.0未満でないと動かないので注意しましょう。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい行を追加
new_row = pd.DataFrame({'名前': ['佐藤'], '年齢': [25]})
df = df.append(new_row, ignore_index=True)
print(df)
名前  年齢
0  田中  28
1  鈴木  34
2  佐藤  25

appendメソッドは簡単に行を追加できますが、パフォーマンスが悪くなるため、今後はconcatを使用することが推奨されます。

concatを使った行の追加

concatを使用すると、複数のDataFrameを結合して行を追加できます。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df1 = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい行を持つDataFrameを作成
df2 = pd.DataFrame({'名前': ['佐藤'], '年齢': [25]})
# DataFrameを結合
df = pd.concat([df1, df2], ignore_index=True)
print(df)
   名前  年齢
0  田中  28
1  鈴木  34
2  佐藤  25

concatを使うことで、複数のDataFrameを効率的に結合することができます。

DataFrameに列を追加する方法

DataFrameに列を追加する方法もいくつかあります。

以下に代表的な方法を紹介します。

直接列を追加する方法

新しい列を直接追加することができます。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい列を追加
df['性別'] = ['男', '男']
print(df)
   名前  年齢 性別
0  田中  28  男
1  鈴木  34  男

新しい列を直接指定することで、簡単に追加できます。

計算結果を基に列を追加する方法

既存の列を使って計算し、その結果を新しい列として追加することもできます。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 年齢に基づいて新しい列を追加
df['年齢の2倍'] = df['年齢'] * 2
print(df)
   名前  年齢  年齢の2倍
0  田中  28      56
1  鈴木  34      68

計算結果を新しい列として追加することで、データの分析がしやすくなります。

条件に基づいて列を追加する方法

条件に基づいて新しい列を追加することも可能です。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 年齢に基づいて新しい列を追加
df['成人'] = df['年齢'].apply(lambda x: 'はい' if x >= 20 else 'いいえ')
print(df)
   名前  年齢 成人
0  田中  28  はい
1  鈴木  34  はい

条件に基づいて新しい列を追加することで、データの意味をより明確にすることができます。

行を追加する際の注意点

DataFrameに行を追加する際には、いくつかの注意点があります。

特にインデックスの扱いや、appendメソッドの非推奨について理解しておくことが重要です。

インデックスの扱い

行を追加する際のインデックスの扱いは、データの整合性に影響を与えるため注意が必要です。

インデックスを指定して行を追加する

locを使用して特定のインデックスに行を追加する場合、既存のインデックスと重複しないように注意が必要です。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# インデックス2に新しい行を追加
df.loc[2] = ['佐藤', 25]
print(df)
   名前  年齢
0  田中  28
1  鈴木  34
2  佐藤  25

このように、指定したインデックスに行を追加することができますが、既存のインデックスと重複しないように注意しましょう。

インデックスを自動で割り当てる方法

新しい行を追加する際に、インデックスを自動で割り当てることも可能です。

concatを使用する場合、ignore_index=Trueを指定することで自動的にインデックスが割り当てられます。

import pandas as pd
# 初期のDataFrameを作成
df1 = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい行を持つDataFrameを作成
df2 = pd.DataFrame({'名前': ['佐藤'], '年齢': [25]})
# DataFrameを結合し、インデックスを自動で割り当てる
df = pd.concat([df1, df2], ignore_index=True)
print(df)
   名前  年齢
0  田中  28
1  鈴木  34
2  佐藤  25

この方法を使うことで、インデックスの重複を避けることができます。

appendメソッドの非推奨について

appendメソッドは簡単に行を追加できる便利な方法ですが、Pandasのバージョン1.4.0以降は非推奨となっています。

appendの代替としてconcatを使う理由

appendメソッドは、内部で新しいDataFrameを作成するため、パフォーマンスが低下する可能性があります。

特に大量のデータを扱う場合、concatを使用することで効率的に行を追加できます。

concatの使い方と注意点

concatを使用する際は、結合するDataFrameのリストを渡し、ignore_indexオプションを指定することでインデックスを自動で割り当てることができます。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df1 = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい行を持つDataFrameを作成
df2 = pd.DataFrame({'名前': ['佐藤'], '年齢': [25]})
# DataFrameを結合
df = pd.concat([df1, df2], ignore_index=True)
print(df)
   名前  年齢
0  田中  28
1  鈴木  34
2  佐藤  25

concatを使用する際は、結合するDataFrameの列名が一致していることを確認することが重要です。

列名が異なる場合、NaN値が追加されることがあります。

列を追加する際の注意点

DataFrameに列を追加する際には、いくつかの注意点があります。

特に列の長さや既存の列との関係に注意を払う必要があります。

列の長さが異なる場合の挙動

新しい列を追加する際、既存のDataFrameの行数と新しい列の長さが異なる場合、Pandasはどのように処理するのでしょうか。

列の長さが異なる場合のエラー回避方法

新しい列の長さが既存のDataFrameの行数と異なる場合、エラーが発生します。

これを回避するためには、追加する列の長さを既存のDataFrameに合わせる必要があります。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい列を追加する際に長さを合わせる
df['性別'] = ['男', '男']  # 正しい長さ
print(df)
   名前  年齢 性別
0  田中  28  男
1  鈴木  34  男

もし新しい列の長さが異なる場合、以下のようにエラーが発生します。

# 列の長さが異なる場合
df['性別'] = ['男']  # エラーが発生する

このように、列の長さを合わせることが重要です。

NaN値の扱い

新しい列の長さが既存のDataFrameの行数よりも少ない場合、Pandasは不足分をNaNで埋めます。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 新しい列を追加する際に長さが異なる
df['性別'] = ['男']  # 1つの値のみ
print(df)
   名前  年齢  性別
0  田中  28   男
1  鈴木  34  NaN

このように、長さが異なる場合はNaNが自動的に追加されるため、データの整合性に注意が必要です。

既存の列を上書きしないための注意点

新しい列を追加する際、既存の列を上書きしないように注意が必要です。

同名の列が存在する場合の対処法

新しい列を追加する際に、既存の列と同名の列を追加すると、既存の列が上書きされてしまいます。

これを避けるためには、列名を変更するか、既存の列名を確認することが重要です。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({
    '名前': ['田中', '鈴木'],
    '年齢': [28, 34]
})
# 同名の列を追加しようとする
df['年齢'] = [30, 35]  # 既存の列が上書きされる
print(df)
   名前  年齢
0  田中  30
1  鈴木  35

このように、同名の列を追加すると既存の列が上書きされてしまいます。

新しい列を追加する際は、列名が重複しないように注意しましょう。

既存の列を上書きしないためには、以下のように新しい列名を指定することが推奨されます。

# 新しい列名を指定して追加
df['新しい年齢'] = [30, 35]
print(df)
   名前  年齢  新しい年齢
0  田中  30      30
1  鈴木  35      35

このように、適切な列名を使用することで、既存の列を上書きせずに新しい列を追加することができます。

応用例:DataFrameの行・列追加を活用する

PandasのDataFrameに行や列を追加する技術は、さまざまなデータ処理のシナリオで非常に役立ちます。

ここでは、いくつかの応用例を紹介します。

新しいデータを動的に追加する

データの収集や分析を行う際に、新しいデータを動的に追加することが求められることがあります。

リアルタイムデータの追加

リアルタイムデータを追加する場合、例えばセンサーからのデータを定期的に取得してDataFrameに追加することが考えられます。

以下はその例です。

import pandas as pd
import random
import time
# 初期のDataFrameを作成
df = pd.DataFrame(columns=['時刻', '温度'])
# データを追加するループ
for _ in range(5):
    current_time = pd.Timestamp.now()
    temperature = random.uniform(20.0, 30.0)  # ランダムな温度を生成
    df = df.append({'時刻': current_time, '温度': temperature}, ignore_index=True)
    time.sleep(1)  # 1秒待機
print(df)
                 時刻    温度
0 2023-10-01 12:00:00  25.34
1 2023-10-01 12:00:01  22.45
2 2023-10-01 12:00:02  27.12
3 2023-10-01 12:00:03  24.67
4 2023-10-01 12:00:04  29.01

このように、リアルタイムでデータを追加することができます。

Webスクレイピング結果の追加

Webスクレイピングを行い、取得したデータをDataFrameに追加することも可能です。

以下はその例です。

import pandas as pd
import requests
from bs4 import BeautifulSoup
# スクレイピング対象のURL
url = 'https://example.com/data'
# データを取得
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
# 初期のDataFrameを作成
df = pd.DataFrame(columns=['タイトル', 'リンク'])
# データを追加
for item in soup.find_all('h2'):
    title = item.text
    link = item.find('a')['href']
    df = df.append({'タイトル': title, 'リンク': link}, ignore_index=True)
print(df)

このように、Webから取得したデータをDataFrameに追加することができます。

複数のDataFrameを結合して行・列を追加する

複数のDataFrameを結合することで、行や列を追加することができます。

concatを使った複数DataFrameの結合

concatを使用すると、複数のDataFrameを簡単に結合できます。

以下はその例です。

import pandas as pd
# 2つのDataFrameを作成
df1 = pd.DataFrame({'名前': ['田中', '鈴木'], '年齢': [28, 34]})
df2 = pd.DataFrame({'名前': ['佐藤', '山田'], '年齢': [25, 30]})
# DataFrameを結合
df = pd.concat([df1, df2], ignore_index=True)
print(df)
   名前  年齢
0  田中  28
1  鈴木  34
2  佐藤  25
3  山田  30

このように、concatを使うことで複数のDataFrameを簡単に結合できます。

mergeを使った結合と列の追加

mergeを使用すると、共通の列を基にDataFrameを結合し、新しい列を追加することができます。

以下はその例です。

import pandas as pd
# 2つのDataFrameを作成
df1 = pd.DataFrame({'名前': ['田中', '鈴木'], '年齢': [28, 34]})
df2 = pd.DataFrame({'名前': ['田中', '鈴木'], '性別': ['男', '男']})
# DataFrameを結合
df = pd.merge(df1, df2, on='名前')
print(df)
   名前 年齢 性別
0  田中  28  男
1  鈴木  34  男

このように、mergeを使うことで共通の列を基にDataFrameを結合し、新しい列を追加することができます。

条件に基づいて行や列を追加する

条件に基づいて行や列を追加することも可能です。

条件付きで行を追加する方法

特定の条件に基づいて行を追加することができます。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({'名前': ['田中', '鈴木'], '年齢': [28, 34]})
# 条件に基づいて新しい行を追加
if df['年齢'].mean() > 30:
    df.loc[len(df)] = ['新しい', 40]
print(df)
   名前  年齢
0  田中  28
1  鈴木  34

この場合、条件が満たされないため新しい行は追加されません。

条件付きで列を追加する方法

条件に基づいて新しい列を追加することも可能です。

以下はその例です。

import pandas as pd
# 初期のDataFrameを作成
df = pd.DataFrame({'名前': ['田中', '鈴木'], '年齢': [28, 34]})
# 年齢に基づいて新しい列を追加
df['成人'] = df['年齢'].apply(lambda x: 'はい' if x >= 20 else 'いいえ')
print(df)
   名前  年齢 成人
0  田中  28  はい
1  鈴木  34  はい

このように、条件に基づいて新しい列を追加することで、データの意味をより明確にすることができます。

まとめ

この記事では、PandasのDataFrameに行や列を追加する方法について詳しく解説しました。

具体的には、行や列を追加する基本的な操作から、注意点、応用例まで幅広く取り上げました。

これを機に、実際のデータ処理においてDataFrameの操作を積極的に活用し、効率的なデータ分析を行ってみてください。

関連記事

Back to top button