Python

Python基礎:文字列が数字であるかを判別する

スポンサーリンク

はじめに

今回は、読み込んだデータが「数値」であるかを判定するisdigit()メソッドを扱います。日付の処理をするときに、元のデータが文字列型数値型によって処理が異なりましたね。その前段階として数値であるかを判定して処理を分けることがあります。早速やってみましょう。

サンプルデータ

今回は次のようなサンプルデータを使います。日付の部分に書式が異なるデータが混在してしまったようなケースです。

# ライブラリのインポート
import pandas as pd

# データの取り込み
zoo=pd.read_excel('data/zoo.xlsx')
zoo

この入園日のところを日付として処理していくことにします。まずは、型を調べておきましょう。

zoo.info()

isdigit()

入園日という列は文字列として取り込まれています。ただ、数値のように見える部分もありますね。このデータは文字列として取り込まれていても、to_datetime()メソッドではうまく処理できません。別の処理が必要です。そこで、数値として取り込まれている部分とそうでない部分にわけることを考えます。

# 文字列メソッドstr.isdigit()で数値として取り込まれているものを抽出
flg_is_digit=zoo['入園日'].astype('str').str.isdigit()
flg_is_digit

str.digit()で1行目,4行目の入園日が43622,42796とシリアル値で取り込まれているところを抽出できました。isdigitは文字列メソッドで、すべての文字が数字ならTrue、そうでないならFalseを返します。

では数値として取り込まれているものと、文字列として取り込まれているものを順に処理していきましょう。

# 数値として取り込まれているものを処理
from_Serial=pd.to_timedelta(zoo.loc[flg_is_digit,'入園日'],unit='D')+pd.to_datetime('1900/01/01')
from_Serial
# 文字列として読み込まれているものを処理
from_String=pd.to_datetime(zoo.loc[~flg_is_digit,'入園日'])
from_String

これで、数値として読み込まれているもの、文字列として読み込まれているものを処理できました。最後にまとめておきましょう。

zoo['入園日']=pd.concat([from_Serial,from_String])
zoo
スポンサーリンク

まとめ

いかがでしょうか?はじめに入園日の部分の表記がばらついていましたが、きれいに統一することができました。このように、実データを扱うときにはデータの表記の揺れの問題がつきものです。対処方法を是非、身に着けておきましょう。

コメント

タイトルとURLをコピーしました