データサイエンティスト・データエンジニアに求められるスキルのひとつに「データクレンジング」または「前処理」と呼ばれるデータの整形・加工スキルがあります。
今回の記事では、
- エクセルの文字列置換が不便だと感じている
- 正規表現について知りたい
という人に向けて、正規表現を紹介していきます。
データエンジニア必須スキルの正規表現のすすめ
正規表現とは?
正規表現とは、「文字列の集合体をひとつの文字列で表現する方法のひとつ」です。
少しイメージのわきづらい表現にも思えますが、言い方を変えると、「自由度の高い文字列変換のためなどの表現手段」とも言えます。
この正規表現は、Pythonプログラマーに限らずプログラマーであれば知っているだろう技術のひとつです。私自身も正規表現はPerl(言語処理に強い動的型付け言語)でよく使っていました。
そして、この正規表現は、Pythonのデータ前処理でとても有効な手段となります。
データの前処理と正規表現
1.データの前処理が必要となる事例
はじめに、データの前処理が必要となる事例を見ていきます。
気象庁のホームページに、東京都の月ごとの平均気温のデータが掲載されております(2021年5月1日時点の情報の抜粋)。
一見すると、年月のマトリックスに平均気温の数値データがあるため、この表をCSV化させることで、データ分析にかけることができるように見えます。
しかし、数値データをよく見てみると、数値以外の文字列が含まれているセルがいくつか含まれていることに気づきます。
したがって、オリジナルデータのままでは、分析を行うことはできません。
2.データ前処理の方法
次に、データの前処理の流れを考えていきます。
気象庁のホームページに掲載されている平均気温のデータには、数字データ以外の文字列が含まれておりました。それでは、このデータに対して、どのような処理を行えば分析できるデータとなるでしょうか?
答えは「余計な文字列の情報を取り除く」です。
もし、エクセルで作業しているのであれば、エクセルの置換で処理することを考えると思います。
同様に、Pythonの場合でも文字列の置換用のメソッドがあるのため、Pythonでも置換処理はできます。
しかし、文字列の置換を行う場合は、置換前の文字列を指定する必要があります。
気象庁の平均気温のデータの例であれば、2種類の括弧(終わり小括弧と終わり大括弧)と不要なスペース文字が含まれていることを確認できるため、人手でエクセルやPythonの置換で対処することはできます。
しかし、分析に不要な文字列情報が、あらかじめ分からない、あるいは、様々な種類の文字列が混ざっている場合、はどうでしょうか?
人手での置換処理を行おうとした場合、作業の手間が大きいことは想像できると思います。そのような場合に力を発揮するのが正規表現による文字列置換となります。
3.Pythonでの正規表現の記述例
ここからは、正規表現で自由度の高い文字列置換ができることをイメージしてもらうために、Pythonによる正規表現の記述例を紹介します。
気象庁の平均気温のデータの例では、2種類の括弧(終わり小括弧と終わり大括弧)とスペース文字が含まれていました。
df = pd.DataFrame({'6月': ['22.3 ]', '18.5', '22.0'], '7月': ['26.0 )', '24.3', '26.5'], '8月': ['24.9', '26.6', '25.9']}) df
6月 | 7月 | 8月 | |
---|---|---|---|
0 | 22.3 ] | 26.0 ) | 24.9 |
1 | 18.5 | 24.3 | 26.6 |
2 | 22.0 | 26.5 | 25.9 |
もし、これをPythonで、正規表現を用いて置換を行う場合は次のように記述します。
df2 = df.replace('[\]\) ]', '', regex=True) df2
これは、オリジナルデータのデータフレーム(df)に対して、「終わり小括弧」、「終わり大括弧」、「スペース」の文字列のいずれをも「空文字」に置換(=削除)することを表現しております。
6月 | 7月 | 8月 | |
---|---|---|---|
0 | 22.3 | 26.0 | 24.9 |
1 | 18.5 | 24.3 | 26.6 |
2 | 22.0 | 26.5 | 25.9 |
実行すると、上記のように、データ分析に不要であった文字列を取り除くことができました。
では、次に、もう少し意地悪なデータの場合はどのように処理できるかを見ていきます。
df = pd.DataFrame({'6月': ['22.3 ]', '18.5ABC', 'abc22.0'], '7月': ['26.0 )', 'A24.3BC', '#26.5'], '8月': ['a24.9', '26.6&%', '!!25.9']}) df
6月 | 7月 | 8月 | |
---|---|---|---|
0 | 22.3 ] | 26.0 ) | a24.9 |
1 | 18.5ABC | A24.3BC | 26.6&% |
2 | abc22.0 | #26.5 | !!25.9 |
このデータは不要な文字列の種類が増えており、また数字の前にも文字列が含まているデータとなります。
一つ目の記述例は、不要な文字列を列挙する方法です。
df2 = df.replace('[a-zA-Z\]\)\#\!\%\&\ ]', '', regex=True) df2
6月 | 7月 | 8月 | |
---|---|---|---|
0 | 22.3 | 26.0 | 24.9 |
1 | 18.5 | 24.3 | 26.6 |
2 | 22.0 | 26.5 | 25.9 |
上記の通り、意地悪なデータに対しても、分析に不要な文字列を取り除くことができました。
さらに、二つ目の記述例は、もっとシンプルな記述方法です。
df3 = df.replace('^[\D]*|[\D]*$', '', regex=True) df3
これは、数字以外の文字列をすべて置換させる方法です。数字以外の文字列をひとつの記述で表現していることが特徴です。ここでは、小数点を表すカンマ(.)も文字列として扱われるため、小数点は削除されないような工夫をしております。
6月 | 7月 | 8月 | |
---|---|---|---|
0 | 22.3 | 26.0 | 24.9 |
1 | 18.5 | 24.3 | 26.6 |
2 | 22.0 | 26.5 | 25.9 |
実行結果は、先ほどと同じように、分析に不要な文字列を取り除くことができています。
さて、ここでは正規表現の文法の説明は行わないため、文字列置換のカラクリは明かされないままとなりますが、「1行コードを書いただけで自由度が高い文字列置換が出来そうだ」という雰囲気は伝わったかと思います。
4.データサイエンス領域における正規表現の応用例
データサイエンスの領域において、正規表現を活かせるもうひとつのフィールドに自然言語処理があります。
自然言語処理では、私たちが使う言葉(文章)を、単語ごとの要素に分解したうえで統計学的な処理に基づき解析を行います。
その過程で、解析に不要な助詞や特定の文字列などを除外する作業においても、この正規表現が活躍します。
自然言語処理における正規表現については、「SNSや口コミデータの分析で使える形態素解析について」で紹介していますので、ぜひこちらの記事もご参照ください。
さて、ここまでは正規表現の便利さを紹介していきました。
最後にPythonで使える正規表現のライブラリと、正規表現に対応するテキストエディタを紹介して終わりにします。
Pythonで使える正規表現ライブラリ
Pythonで正規表現を行う場合に使えるライブラリは次の2つです。
ここでは、Pythonで文字列の置換および正規表現の処理が出来ることを、頭の片隅に残してもらえればOKです。文法などの説明は行いません。
- re … 正規表現操作モジュール
- regex … re互換モジュール(機能拡張あり)
実際のPythonプログラミングで正規表現が必要となった場合は、Python公式ページ内のマニュアルページなどを参照してください。
正規表現に対応するテキストエディタ
正規表現はプログラミング以外の業務でも活用できます。しかし、ExcelやWordは正規表現の機能は搭載しておりません。
一方で、正規表現に対応しているテキストエディタは多くあります。
- Atom … フリーウェア・macOS/Windows対応
- Sublime Text … フリーウェア・macOS/Windows対応
- Visual Studio Code … フリーウェア・macOS/Windows対応
- iText Express … フリーウェア・macOS対応
- K2Editor … フリーウェア・Windows対応
- サクラエディタ … フリーウェア・Windows対応
- 秀丸エディタ … シェアウェア・Windows対応
Pythonなどのデータエンジリアリングをやらない人でも、正規表現が活躍する場面はあるかと思いますので、興味ある方はチェックしてみてください。
まとめ
今回の記事では、正規表現を紹介していきました。
正規表現は「自由度の高い文字列変換のための表現手段」であり、プログラムを行う人であれば、必ず使えるようになっておきたいスキルのひとつです。
そして、データサイエンスの領域においては、データの前処理などで使える有効な手段となりますので、Pythonからプログラミングを始めたという方は、この正規表現を覚えてみてはいかがでしょうか。
じゃあ。