【Pandasデータ型変換】文字列⇔数値の相互変換と書式変更を徹底解説 🔄


 

データ分析の現場では、データソースの多様性から、数値データが文字列として読み込まれてしまったり、その逆のケースに遭遇したりすることが頻繁にあります。また、数値を特定の桁数で表示したり、日付形式に整形したりといった書式変更のニーズも少なくありません。Pandasは、このような文字列と数値の相互変換、そして書式変更を効率的に行うための強力な機能を提供しています。

この記事では、Pandasを使って文字列と数値の相互変換、そして数値や日付の書式変更を自在に行うための主要なテクニックを、短いサンプルコードと丁寧な解説を交えてご紹介します。


 

データ型変換と書式変更とは?なぜ重要なのか?

 

**データ型変換(型キャスト)**とは、Pandas DataFrameやSeriesの列のデータ型を、ある型から別の型へ変更するプロセスです。例えば、object型(文字列型として扱われることが多い)の数字をint型やfloat型に変換することなどです。

書式変更とは、データの内部的な値は変えずに、その表示形式を調整することです。

なぜこれらの操作がデータ分析において重要なのでしょうか?

  • 正確な計算と分析: 数値データが文字列型になっていると、sum()mean()などの数値計算が正しく行えません。

  • メモリ効率とパフォーマンス: 適切なデータ型にすることで、メモリ使用量を削減し、データ処理のパフォーマンスを向上させることができます。

  • エラーの回避: 多くのPandasやNumPyの関数は特定のデータ型を期待するため、型が一致しないとエラーが発生することがあります。

  • 可読性とレポート作成: 整形された書式のデータは、人間にとって理解しやすく、レポートやダッシュボードでの利用に適しています。


 

1. 文字列から数値への変換

 

数値に見える文字列(例: '123', '45.6')を実際の数値型(intfloat)に変換する方法です。

 

astype()メソッドでシンプルに変換

 

最も一般的で簡単な方法です。

Python
 
import pandas as pd
import numpy as np

df = pd.DataFrame({
    'ID': [1, 2, 3],
    '売上文字列': ['100', '150.5', '200'],
    '数量文字列': ['5', '10', '不明'] # 変換できない値を含む
})
print("オリジナルDataFrame:\n", df)
print("\n変換前のデータ型:\n", df.dtypes)

# '売上文字列'列をfloat型に変換
df['売上数値'] = df['売上文字列'].astype(float)
print("\n'売上文字列'をfloat型に変換後:\n", df[['売上文字列', '売上数値']].head())
print("変換後のデータ型 (売上数値):\n", df['売上数値'].dtype)

解説:

df[‘列名’].astype(float)のように、変換したいデータ型を引数に指定します。intやfloatなどの数値型を指定できます。ただし、変換できない値(例: ‘不明’)があるとエラーになります。

 

pd.to_numeric()でエラーをハンドリング

 

変換できない値が含まれる場合でも、エラーを避けつつ処理を進めたい場合は、pd.to_numeric()関数が非常に便利です。

Python
 
# '数量文字列'列を数値に変換(エラーはNaNにする)
df['数量数値'] = pd.to_numeric(df['数量文字列'], errors='coerce')
print("\n'数量文字列'を数値に変換(エラーをNaNに)後:\n", df[['数量文字列', '数量数値']].head())

# '数量文字列'列を数値に変換(エラーの場合は行を削除)
df_strict = pd.DataFrame({'値': ['1', '2', 'エラー', '4']})
df_strict['値_数値'] = pd.to_numeric(df_strict['値'], errors='drop')
print("\n'値'を数値に変換(エラーの行を削除)後:\n", df_strict.dropna().head())

解説:

  • errors='coerce': 変換できない値があった場合、その値を**NaN(欠損値)**に置き換えます。これが最もよく使われるオプションです。

  • errors='raise': デフォルトの動作で、変換できない値があった場合にエラーを発生させます。

  • errors='drop': 変換できない値を含む行をDataFrameから削除します。


 

2. 数値から文字列への変換

 

数値型データを、表示のために特定の書式の文字列に変換したい場合です。

 

astype(str)でシンプルに変換

 

最も直接的な方法で、数値を単純な文字列に変換します。

Python
 
# '売上数値'列を文字列に変換
df['売上再文字列'] = df['売上数値'].astype(str)
print("\n'売上数値'を文字列に変換後:\n", df[['売上数値', '売上再文字列']].head())
print("変換後のデータ型 (売上再文字列):\n", df['売上再文字列'].dtype)

解説:

astype(str)を使用すると、数値がそのまま文字列表現になります。

 

map()やf-stringで書式を細かく指定

 

特定の書式(例: 桁区切り、小数点以下の桁数固定、単位追加など)を適用したい場合は、map()apply()とPythonのf-string(フォーマット済み文字列リテラル)を組み合わせるのが強力です。

Python
 
# '売上数値'列を千円単位の文字列に変換 (小数点以下なし、カンマ区切り)
df['売上表示'] = df['売上数値'].map(lambda x: f'{x:,.0f}円' if pd.notna(x) else np.nan)
print("\n売上数値に書式を適用後:\n", df[['売上数値', '売上表示']].head())

# '数量数値'を整数として表示し「個」を付ける
df['数量表示'] = df['数量数値'].map(lambda x: f'{int(x)}個' if pd.notna(x) else np.nan)
print("\n数量数値に書式を適用後:\n", df[['数量数値', '数量表示']].head())

解説:

  • f'{x:,.0f}円': f-stringの書式指定子を使っています。

    • :,.0f は、数値をカンマ区切りで表示し、小数点以下を0桁にするフォーマットです。

    • if pd.notna(x) else np.nan: NaN値がある場合にエラーにならないよう、NaNの場合はNaNを返しています。


 

3. 日付・時刻の書式変更

 

日付・時刻データ(datetime型)の書式を変更する場合も同様の考え方です。

Python
 
# サンプルDataFrame(日付)
df_date = pd.DataFrame({
    '注文日': pd.to_datetime(['2023-01-01', '2023-02-15', '2024-10-20'])
})
print("\nオリジナルDataFrame (日付):\n", df_date)
print("変換前のデータ型 (注文日):\n", df_date['注文日'].dtype)

# '注文日'を'YYYY/MM/DD'形式の文字列に変換
df_date['注文日_表示'] = df_date['注文日'].dt.strftime('%Y/%m/%d')
print("\n日付を書式変更後:\n", df_date)
print("変換後のデータ型 (注文日_表示):\n", df_date['注文日_表示'].dtype)

解説:

  • dtアクセサ: Seriesがdatetime型の場合に、日付・時刻固有の操作を行うためのアクセサです。

  • strftime('%Y/%m/%d'): 日付を特定のフォーマット文字列に変換します。

    • %Y: 4桁の年

    • %m: 2桁の月

    • %d: 2桁の日


 

まとめ

 

Pandasにおいて、文字列と数値の相互変換、そして書式変更はデータ分析の前処理において不可欠なスキルです。

  • 文字列→数値: astype()でシンプルに、または**pd.to_numeric(errors='coerce')**で安全に変換。

  • 数値→文字列: astype(str)で基本的な変換、または**map()とf-string**で書式を細かく指定。

  • 日付の書式変更: dt.strftime()で自在にフォーマット。

これらのテクニックを使いこなすことで、様々な形式で格納されたデータを分析に適した形に整形し、見やすいレポートを作成できるようになります。データ型の適切な管理は、効率的で正確なデータ分析の基盤となることを覚えておきましょう。