今回は整数文字列内にカンマ(,)が含まれている際の整数型への変換方法を実装していきます。
整数文字列とは以下のように文字列型の数字です。
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()」であります。
「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を使用した型変換にはシリーズから「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標準の操作を実行することができるという方法を知ったのです。
それでは最後までありがとうございました。