PythonのPandasでは、文字列に含まれている数値を抽出・変換して数値型(intやfloat)に変換するという処理は、データの前処理で非常によく使われるテクニックです。
たとえば「¥1,200」や「約300人」などのように、数字に不要な文字が混じっている場合、それを取り除いて数値として扱う必要があります。
目次
基本的な考え方
PandasのSeries
(通常はDataFrame
の1列)は、.str
アクセサを使うことで文字列処理のメソッドが使えるようになります。
また、str.replace()
、str.extract()
、astype()
などを組み合わせることで、数値変換が可能です。
例1:単純な文字列→数値変換
import pandas as pd
df = pd.DataFrame({
'price': ['1000', '2500', '3500']
})
# 文字列をintに変換
df['price'] = df['price'].astype(int)
print(df)
カンマや記号がある場合
df = pd.DataFrame({
'price': ['1,000円', '2,500円', '3,000円']
})
# カンマと円記号を除去してからintに変換
df['price'] = df['price'].str.replace(',', '').str.replace('円', '').astype(int)
print(df)
⚠
str.replace()
を使うときは、複数の文字を順に削除可能です。正規表現(regex)も使えます。
数字を含む文字列から数値のみ抽出
df = pd.DataFrame({
'info': ['約300人', '1500名', '100人程度']
})
# 正規表現で数字部分だけ抽出 → intに変換
df['人数'] = df['info'].str.extract(r'(\d+)').astype(int)
print(df)
str.extract()
は正規表現のパターンにマッチした部分を取り出します。
小数を含む数値の抽出
df = pd.DataFrame({
'weight': ['体重: 65.5kg', '体重: 70.2kg', '体重: 58.0kg']
})
# 小数点を含む数値を抽出 → floatに変換
df['体重'] = df['weight'].str.extract(r'(\d+\.\d+)').astype(float)
print(df)
一括して複数の記号を除去したい場合(正規表現で除去)
df = pd.DataFrame({
'price': ['¥1,200', '¥2,500', '¥3,800']
})
# 正規表現で数字以外を除去 → intに変換
df['price'] = df['price'].str.replace(r'\D', '', regex=True).astype(int)
print(df)
\D
は「数字以外の文字」を意味します。regex=True
を指定することで正規表現が使えます。
よくある応用パターン
処理内容 | 方法 |
---|---|
通貨記号や単位の削除 | str.replace() で除去 |
数字の抽出 | str.extract(r'\d+') (整数)または r'\d+\.\d+' (小数) |
数字と文字列が混在 | str.replace() とastype() を組み合わせる |
数値と文字列を一括で正規表現処理 | str.replace(r'\D', '', regex=True) |
実践演習データ例
df = pd.DataFrame({
'salary': ['¥5,000', '¥7,500', '¥10,000'],
'bonus': ['約500円', '1000円程度', 'なし']
})
# salary: ¥記号とカンマ削除してint化
df['salary'] = df['salary'].str.replace(r'\D', '', regex=True).astype(int)
# bonus: 数値があれば抽出、なければNaN
df['bonus'] = pd.to_numeric(df['bonus'].str.extract(r'(\d+)')[0], errors='coerce')
print(df)
出力結果
salary bonus
0 5000 500.0
1 7500 1000.0
2 10000 NaN
まとめ
操作 | 方法 | 型変換 |
---|---|---|
数字の取り出し | str.extract() | .astype(int or float) |
記号の削除 | str.replace() | .astype(int or float) |
数字以外の削除 | str.replace(r'\D', '', regex=True) | .astype(int) |
変換失敗でNaNにしたい | pd.to_numeric(..., errors='coerce') | float 型に自動変換 |
以上、PythonのPandasで文字列にある数値を変換する方法についてでした。
最後までお読みいただき、ありがとうございました。