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.columns を list で囲むことで列名のリストが得られます。
また、例として先頭の列名を除外する方法も紹介します。
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を使ったデータ加工において非常に汎用的なテクニックです。