0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pandasで詰まったところ(備忘録)

Last updated at Posted at 2025-11-13

Pandasでのデータフレーム操作まとめ

この記事では、Pandasを用いたデータフレームの結合方法、列や値の操作、エラーチェックの方法など、よく使うテクニックについて解説します。各コード例の直前には、その目的や背景について簡単な説明を記載しているので、初学者でも理解しやすい構成になっています。

1. 同じ配列をマージするときの挙動

Pandasのmerge関数を使って、同じ列名を持つデータフレームを結合する場合、左側のデータが"_x"、右側のデータが"_y"というサフィックスで自動的に付与されます。
たとえば、以下の例では、data1の"DD [m/s]"列は"DD [m/s]_x"、data2の"DD[m/s]"列は"DD[m/s]_y"となります。
※注意:コード中の変数名や列名は統一する必要があるので、実際の用途に合わせて調整してください。

import pandas as pd

# サンプルデータの用意(data1とdata2で列名に微妙な差異がある場合は後で調整が必要)
data1 = {
    'time [s]': [0, 0.5, 1],
    'AA [m/s]': [10, 20, 30],
    'BB [m/s]': [11, 22, 33],
    'CC [m/s]': [44, 55, 66],
    'DD [m/s]': [77, 88, 99]
}

data2 = {
    'time [s]': [0, 0.5],
    'DD [m/s]': [11, 22]
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)

df_merged = pd.merge(df1, df2, on='time [s]', how='left')
# 結果として、
# df1の"DD [m/s]"は"DD [m/s]_x"、df2の"DD [m/s]"は"DD [m/s]_y"に変更される
print(df_merged.head())

2. データフレームの結合方法(concatの利用)

複数のデータフレームを結合する際は、pd.concatを利用します。
縦方向(axis=0)と横方向(axis=1)の違いを確認しましょう。

import pandas as pd

# サンプルデータの用意
df_a = pd.DataFrame({'A': [1, 2, 3]})
df_b = pd.DataFrame({'B': [4, 5, 6]})

# 縦に連結:行が追加される
df_concat_axis0 = pd.concat([df_a, df_b], axis=0)
print("縦方向(axis=0)の結合結果:")
print(df_concat_axis0)

# 横に連結:列が追加される
df_concat_axis1 = pd.concat([df_a, df_b], axis=1)
print("横方向(axis=1)の結合結果:")
print(df_concat_axis1)

また、実際のプロジェクトでは既存のデータフレームに新たなデータフレームを追加する場合、以下のように記述できます。

self.df_filling_data = pd.concat(
[self.df_filling_data, df_merged], axis=0
)

3. 欠損値に対して値を補完する方法

combine_firstを使うと、あるデータフレームの欠損値に対して、別のデータフレームの対応する値を補完できます。
以下はその使い方の例です。

import pandas as pd
import numpy as np

# サンプルデータの作成
df1 = pd.DataFrame({
    'a': [1., np.nan, 5., np.nan],
    'b': [np.nan, 2., np.nan, 6.],
    'c': range(2, 18, 4)
})
df2 = pd.DataFrame({
    'a': [5., 4., np.nan, 3., 7.],
    'b': [np.nan, 3., 4., 6., 8.]
})

# df1の欠損値に、df2の値を補完
df_combined = df1.combine_first(df2)
print(df_combined)

4. 特定の値の置換方法

データフレーム内の特定の値を条件に基づいて変更する方法です。
以下の例では、「初期値」という文字列を「aaa」に置換しています。

import pandas as pd

# サンプルデータの作成
data = {'column_name': ['初期値', '他の値', 'テスト値', '別の値']}
df = pd.DataFrame(data)

# 条件に基づく置換
df.loc[df['column_name'] == '初期値', 'column_name'] = 'aaa'
print(df)

5. 特定の列を削除する方法

列名に特定の文字列(例:"_y")が含まれている場合、または不要な列(例:"時間[sec]")をまとめて削除する方法です。

# "_y"が含まれる列と不要な列 "時間[sec]" を削除する
columns_to_drop =
[col for col in df_merged.columns if '_y' in col] + ['時間[sec]']

df_cleaned = df_merged.drop(columns=columns_to_drop)

print("不要な列削除後のデータフレーム:")
print(df_cleaned.head())

6. データフレームの列名を配列に変換する方法

単に df.columnslist で囲むことで列名のリストが得られます。
また、例として先頭の列名を除外する方法も紹介します。

import pandas as pd

data1 = {
    'xtime [s]': [0, 0.5, 1],
    'DD [m/s]': [11, 22, 33],
    'FF [km/h]': [44, 55, 66]
}

df1 = pd.DataFrame(data1)
# 先頭の列名を除外したリストを作成
df1_list = list(df1.columns)[1:]
print("先頭列を除いた列名リスト:", df1_list)

7. 特定の値の置換:mask関数の利用

将来的にreplaceが廃止される可能性を見越して、maskを使う方法を紹介します。
以下の例では、「初期値」と書かれている値をNumPyのNaNに変更します。

import pandas as pd
import numpy as np

# サンプルデータの作成
df_merged = pd.DataFrame({
    'column1': ['初期値', 'a', '初期値', 'b'],
    'column2': [1, 2, 3, 4]
})

df_merged = df_merged.mask(df_merged == '初期値', np.nan)
print("maskによる値の置換結果:")
print(df_merged)

8. 最終行の値の取得方法

データフレームの最終行にある特定の列の値を取得する場合、ilocを利用します。

# 最終行の0番目の列の値を取得
last_value = df_merged.iloc[-1, 0]
print("最終行の0番目の値:", last_value)

9. 列に値を追加する方法

既存の列のある値に加算するなど、型変換を伴う操作例です。
例えば、文字列として格納された数値に対してfloat型に変換して加算します。

# 仮に last_time は足し合わせたい値
last_time = 5.0
df_merged.iloc[:, 0] = df_merged.iloc[:, 0].astype(float) + last_time
print("値追加後のデータフレーム:")
print(df_merged)

10. 結合時に抜けてしまった値のエラーチェック

データフレームをmergeする際に、欠損値が発生した場合のエラーチェック方法についてです。
以下の例では、左右のデータフレームの時刻情報をマージし、左側に存在しない値がある場合はエラーを発生させます。

import pandas as pd

# 左側のデータフレーム(温度データ)
df_left = pd.DataFrame({
    '時刻': ['12:00', '12:30'],
    '温度': [21, 22]
})

# 右側のデータフレーム(湿度データから温度に変更)
df_right = pd.DataFrame({
    '時刻': ['12:00', '12:30', '13:00'],
    '温度': [41, 42, 43]  # 温度に変更
})

# outer結合によるデータマージ
merged_df = pd.merge(
df_left, df_right, on='時刻', how='outer', 
suffixes=('_left', '_right')
)

# 左側に存在しない値(merged_dfの左側温度データがNaNで右側に値がある行)を判定
missing_in_left = merged_df[
merged_df['温度_left'].isna() & 
merged_df['温度_right'].notna()
]

if not missing_in_left.empty:
    raise ValueError(
    f"左側のデータフレームに存在しない時刻があります: 
    {missing_in_left['時刻'].tolist()}"
    )
else:
    print("結合結果:")
    print(merged_df)

最後に

今回紹介した操作は、Pandasを使ったデータ加工において非常に汎用的なテクニックです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?