【Pandasテクニック】複数の列の文字列を結合して新しい列を生成する方法


 

データ分析では、既存の複数の列の情報を組み合わせて、新しい意味を持つ列を作成することがよくあります。特に、氏名(姓と名)、住所(都道府県、市区町村、番地)、または商品コードの組み合わせなど、複数の文字列列を結合して一つの新しい列を生成する操作は非常に頻繁に行われます。Pandasを使えば、この文字列結合処理を簡単かつ効率的に行うことができます。この記事では、DataFrameの複数の列を結合して新しい列を作成する具体的な方法を、短いサンプルコードと丁寧な解説でご紹介します。


 

なぜ複数の文字列列を結合するのか?

 

複数の文字列列を結合して新しい列を生成する主な理由は以下の通りです。

  • データの統合と正規化: 分散している情報を一つの列にまとめることで、データの管理や利用がしやすくなります。

  • 特徴量エンジニアリング: 機械学習モデルの入力として、より意味のある新しい特徴量を作成できます。例えば、姓名を結合してフルネームにすることで、個人の特定が容易になります。

  • 可読性の向上: 報告書や出力データで、関連する情報をまとめて表示することで、データの可読性が向上します。


 

複数の列の文字列を結合する基本的な方法

 

Pandasで複数の列の文字列を結合する最も一般的な方法は、Seriesの+演算子やstr.cat()メソッドを利用することです。

 

+演算子で文字列列を結合する

 

最も直感的で簡単な方法です。文字列型のSeries(DataFrameの列)同士を+で結合すると、文字列が連結されます。

Python
 
import pandas as pd

# サンプルDataFrameの作成
df = pd.DataFrame({
    '姓': ['山田', '佐藤', '田中'],
    '名': ['太郎', '花子', '次郎'],
    '都市': ['東京', '大阪', '福岡']
})
print("オリジナルDataFrame:\n", df)

# '姓'と'名'を結合して'氏名'列を作成
df['氏名'] = df['姓'] + df['名']
print("\n'氏名'列追加後:\n", df)

解説:

df[‘姓’] + df[‘名’]とすることで、各行の「姓」と「名」の文字列がそのまま連結され、新しい’氏名’列がDataFrameに追加されました。

 

区切り文字を入れて結合する

 

間にスペースやハイフンなどの区切り文字を入れたい場合は、区切り文字も文字列として+で結合します。

Python
 
# '姓'と'名'をスペース区切りで結合して'フルネーム'列を作成
df['フルネーム'] = df['姓'] + ' ' + df['名']
print("\n'フルネーム'列追加後:\n", df)

# '都市'と'氏名'をハイフン区切りで結合して'居住者情報'列を作成
df['居住者情報'] = df['都市'] + '-' + df['氏名']
print("\n'居住者情報'列追加後:\n", df)

解説:

文字列リテラル(例: ‘ ‘や’-‘)を間に挟むことで、自由に区切り文字を入れることができます。


 

str.cat()メソッドを使う(欠損値がある場合や複数の列をまとめて結合する場合)

 

+演算子はシンプルですが、結合したい列に**欠損値(NaN)**が含まれている場合、結果がNaNになってしまうことがあります。また、3つ以上の列を結合する際に、少しコードが長くなる傾向があります。このような場合にstr.cat()メソッドが非常に便利です。

 

欠損値(NaN)がある列を結合する際の挙動

 

まずは+演算子の挙動を確認しましょう。

Python
 
df_nan = pd.DataFrame({
    'Prefix': ['A', 'B', 'C'],
    'Value': ['1', np.nan, '3'], # np.nanが含まれる
    'Suffix': ['X', 'Y', 'Z']
})
print("\nNaNを含むオリジナルDataFrame:\n", df_nan)

# 'Value'列にNaNがあるため、結合結果もNaNになる
df_nan['Combined_Plus'] = df_nan['Prefix'] + df_nan['Value'] + df_nan['Suffix']
print("\n'+'演算子で結合 (NaNを含む):\n", df_nan)

解説:

インデックス1の行では’Value’列がnp.nanであるため、結合結果の’Combined_Plus’もnp.nanになっています。

 

str.cat()で欠損値を無視して結合する

 

str.cat()メソッドは、Seriesに対して適用し、他のSeries(またはリスト)を結合します。na_rep引数を使うと、欠損値を指定した文字列で置き換えて結合できます。

Python
 
# 'Value'列のNaNを無視して結合
# Seriesのstr.cat()を使う
df_nan['Combined_Cat'] = df_nan['Prefix'].str.cat(df_nan['Value'].fillna(''), sep='-')
print("\nstr.cat()で結合 (NaNを空文字列で置き換え):\n", df_nan)

解説:

  • df_nan['Value'].fillna(''): np.nanを空文字列''に置き換えています。これにより、結合時にnp.nanが原因で結果がnp.nanになるのを防げます。

  • sep='-': 結合する際に-を区切り文字として挿入しています。

 

複数の列をまとめてstr.cat()で結合する

 

DataFrameのapplyメソッドとstr.cat()を組み合わせることで、複数の列をまとめて結合することも可能です。

Python
 
# 複数の列をまとめて結合(NaNは空文字列として扱う)
# axis=1で行方向に適用し、各行のSeriesに対してstr.cat()を呼び出す
df['Full_Address'] = df[['都市', '氏名']].apply(lambda x: x.str.cat(sep=' '), axis=1)
print("\n複数の列をまとめて結合後:\n", df)

解説:

  • df[['都市', '氏名']]: 結合したい列をDataFrameとして選択します。

  • .apply(lambda x: x.str.cat(sep=' '), axis=1): 各行(axis=1)に対してlambda関数を適用します。xは各行のSeriesになり、そのSeriesに対してstr.cat(sep=' ')を呼び出すことで、要素がスペース区切りで結合されます。

  • この方法では、もし結合対象のSeries xの中にNaNが含まれていても、str.cat()はデフォルトでNaNを無視して結合します。明示的にNaNを何かで埋めたい場合は、fillna()を挟みます。


 

どの方法を選ぶべきか?使い分けのポイント

 

  • シンプルな2列の結合でNaNが含まれない場合: +演算子が最も直感的でコードも短くなります。

  • 欠損値(NaN)が含まれる場合: str.cat()メソッドを検討し、fillna('')などでNaNを適切に処理しましょう。

  • 3つ以上の列をまとめて結合する場合: str.cat()sep引数を使うか、applystr.cat()の組み合わせが便利です。


 

まとめ

 

PandasでDataFrameの複数の列の文字列を結合して新しい列を生成する方法は、データ前処理や特徴量エンジニアリングの基本です。シンプルに+演算子を使う方法から、欠損値の扱いや複数の列のまとめての結合に強いstr.cat()メソッドを使う方法まで、様々なアプローチがあります。データの特性や目的に応じて最適な方法を選び、効率的なデータ操作を行いましょう。