カンマ区切りの整数文字列を整数に変換する


投稿日 2021年10月20日 >> 更新日 2023年3月1日

今回は整数文字列内にカンマ(,)が含まれている際の整数型への変換方法を実装していきます。

整数文字列とは以下のように文字列型の数字です。

str_num = '100'
print(type(str_num)
"""
<class 'str'>
"""

例えばGoogleアナリティクスからエクスポートするCSVファイルでは、中身が全て文字列型になっています。

何が困るかというと、膨大なデータ内に「1,000」のようなカンマ(,)が含まれている整数文字列が存在している場合、少しだけ手間が必要です。

そんな整数文字列をサクッと整数型に変換していきます。

実行環境&使用ライブラリ

実行環境
Windows Subsystem for Linux
Python 3.6.9
pip 9.0.1
使用ライブラリ ライセンス
pandas==1.0.0 BSD

カンマ有り整数文字列を整数に変換する

通常文字列型を整数に変換するには、「int()」を使います。


s = '100'
print(type(s), s)
# int()で整数に変換
print(type(int(s)), int(s))
"""
<class 'str'> 100
<class 'int'> 100
"""

しかし桁が上がると「1,000」のようにカンマが混在する場合があります。

このような場合はエラーとなってしまいます。


s = '1,000'
print(type(s), s)
# int()で整数に変換
print(type(int(s)), int(s))
"""
<class 'str'> 1,000
...
ValueError: invalid literal for int() with base 10: '1,000'
"""

そこで役に立つのが「replace()」であります。

replace()で部分文字列の置き換え

「1,000」という文字列を整数に変換するならば、int()を使用する前にreplace()でカンマを置き換えます。


s = '1,000'
print(type(s), s)
# replace()でカンマを別の要素無しに置き換えint()で整数変換
print(type(int(s.replace(',', ''))), int(s.replace(',', '')))
"""
<class 'str'> 1,000
<class 'int'> 1000
"""

上手く変換することができました。

文字列内に複数のカンマが混在していても全て置き換えられます。


str_list = ['1', '10', '100', '1,000', '10,000', '100,000', '1,000,000']
print(str_list)
"""
['1', '10', '100', '1,000', '10,000', '100,000', '1,000,000']
"""

for s in str_list:
    result = s.replace(',', '')
    print(int(result))
"""
1
10
100
1000
10000
100000
1000000
"""

pandasを使用した整数変換

pandasを使用した型変換にはシリーズから「astype()」にアクセスして使いますが整数文字列から整数に変換する場合は「int」を指定します。

import pandas as pd

str_list = ['1', '10', '100', '1,000', '10,000', '100,000', '1,000,000']
sri = pd.Series(str_list)
sri
"""
0            1
1           10
2          100
3        1,000
4       10,000
5      100,000
6    1,000,000
dtype: object
"""

sri.dtype
"""
object
"""

# シリーズ内のデータを整数に変換
sri.astype(int)
"""
...
ValueError: invalid literal for int() with base 10: '1,000'
"""

カンマが混在していると失敗してしまいます。

NaNやNull値などの欠損値が入っている場合は予め別の整数文字列に置き換えるとして、シリーズ内の文字列を操作するにはstr属性を呼び出します。

そうすることによってpythonで使われる文字列操作を簡単に実装することができます。


sri
"""
0            1
1           10
2          100
3        1,000
4       10,000
5      100,000
6    1,000,000
dtype: object
"""

# str属性にアクセスしreplace()で置き換え
sri.str.replace(',', '')
"""
0          1
1         10
2        100
3       1000
4      10000
5     100000
6    1000000
dtype: object
"""

# astype()を組み合わせる
sri.str.replace(',', '').astype(int)
"""
0          1
1         10
2        100
3       1000
4      10000
5     100000
6    1000000
dtype: int64
"""

データフレームの場合も同じ要領でできます。


df = pd.DataFrame({'Before':sri, 'After':sri})
df.head()
"""
    Before  After
0   1   1
1   10  10
2   100 100
3   1,000   1,000
4   10,000  10,000
"""

df.info()
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   Before  7 non-null      object
 1   After   7 non-null      object
dtypes: object(2)
memory usage: 240.0+ bytes
"""

df['After'] = df['After'].str.replace(',', '').astype(int)
df.head()
"""
    Before  After
0   1   1
1   10  10
2   100 100
3   1,000   1000
4   10,000  10000
"""

df.info()
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 7 entries, 0 to 6
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   Before  7 non-null      object
 1   After   7 non-null      int64 
dtypes: int64(1), object(1)
memory usage: 240.0+ bytes
"""

今回このような記事を書いた理由は、Googleアナリティクスのデータをpandasで分析するためにCSVファイルをエクスポートしたのがきっかけであります。

いざ分析しようと思いきや、中身のデータが全て文字列型となっていたのでpandasのastype()で整数にしようとして失敗しました。

そこからstr型にアクセスするとpython標準の操作を実行することができるという方法を知ったのです。

それでは最後までありがとうございました。