一人十郷 - takuminasuno.com一人十郷
takuminasuno.com
ビジネス
2021/04/11

Pythonによるデータ処理の基本まとめ【pandas, json, datetime, gzipなど】

こんにんちは。那須野です。

Pythonでデータ処理をするにあたって、Pythonならではの自由度の高さや他言語との微妙な差異が気になっていたので、自分がよく書く基本的な処理をまとめてみました。振り返ってみると、numpyとかmatlibとかは入っていないのでPythonの基本って何だろうと思いつつもpandas, json, datetime, gzipなどは入れたので、誰かの参考になれば幸いです。

 

 

ちなみに昔、2年前くらいに書いていた記事はこちらです。ご興味ある方は合わせてご査収ください。

【Pythonデータ活用】CSVファイルをJSONファイル、XMLファイルに変換して出力してみる

【備忘録】Pythonでpandasを使ってExcelファイルを読み込んでcsvファイルを出力するまで【Windows PC】

では長い長い本編です。どうぞ。

 

四則演算

一番の留意点は、『++』や『--』といったインクリメントがないこと。

 

数字まるめの処理

一番の留意点は、やはりmath.round。他言語と違って四捨五入ではなく銀行丸めを採用しているため、厳密に四捨五入をするにはDecimalモジュールを使わないといけない。

 

文字列の処理

JavaScriptやPHPに慣れていると文字列や数字などの型を意識せずに結合してしまいがちだが、Pythonでは純粋に文字列同士で結合しないとエラーが起こる。文字列と数字を結合するはstrで文字列型にキャストする必要がある点は留意のこと。一方の便利な点として、スライスで非常に気軽に文字列を抽出できる点が挙げられる。

 

日時の処理

一番の留意点は、日を扱うdt.dateと日時を扱うdt.datetimeに定義の段階で分かれることだろう。メソッドはほぼ共通であるがゆえに、入口にて明確に意識する点は気を付けたい。それ以外でいうと、足し算引き算をするにはrelativedeltaという別モジュールを使う点が直感的な処理ではないため覚えておきたい。

 

配列の処理

文字列と同じようにスライスが圧倒的に便利。それ以外では、lambda関数を配列の各要素に一括でかけるmap処理が便利なので、mapの戻り値がオブジェクト(イテレータ)なのでそのままforループはできるが配列として扱いたいときは改めてlistにかける必要がある点と一緒に頭に入れておきたい。

 

分岐処理

『else if』の書き方が『elif』という非常に独特な書き方なので注意。三項演算子も『{True時の値} if {条件} else {False時の値}』となっていて、口語的な並びで自然言語として読み取りやすいものの他言語と比べると独特なので注意したい。

 

分岐処理のためのboolean判定(True/False判定)

Pythonはboolean判定がサポートされていて便利な印象。inによる包含判定がある点、数字の大小関係が3個以上でも直観的に併記できる点はとくに便利。なお非常に違和感がある点としては、多言語でNULLなどと呼ばれる『未定義』の状態が『None』と別文字で表記する必要がある点が挙げられる。JSON形式でファイル出力したりするとnullに変換されるるので非常にややこしい。

 

ループ処理

他言語でよくあるインクリメントによるfor ループが存在しないため、インクリメントを意識したループを書くときにはenumerateを使ったりrangeを使ったりインクリメントを明示したwhileを使ったりなど工夫する必要がある。なお、そのデメリットが気にならないほどに、要素そのものをループ変数に参照渡しするforループは非常に便利なので、この特性を有効活用できる書き方に寄せるというのが正攻法だと感じる。

ただし、ループ変数に直接代入をすると「新たに変数が定義されて元変数は更新されない」という罠はPythonでも健在なので、ループ変数を更新する前提の書き方は特に注意する必要がある。

 

JSON処理

jsonモジュールを使うと簡単にJSONファイルの入出力ができる。ファイルから文字列を読み込む際は、UTF-8を前提にしたい。

なお、jsonにはdumps/dump、loads/loadという2種類のメソッドがあり、複数形と単数形という違いに見えるが、機能的にはオブジェクトを直接渡すか文字列を渡すかの違いがあり、意外と重要。

 

Pandas.Dataframeの基本処理

pandasを使う場合は、組み込み関数やapplyを中心とした一括変換でパフォーマンスが向上するので、一括変換を意識して活用していきたい。行列のループを書いて個別にループ処理することも無理矢理はできるが、効率では劣る。注意点として、ExcelやCSVなどの外部ファイルを取り込んだときに空白だった箇所は空白(『』)ではなく『NaN』として値が入るため、いわゆるNULL判定をpd.isna関数で行う点は留意したいところ。

 

Pandasによるファイル処理

ファイル処理で気を付けたいものナンバーワンは、とくかくエンコード。UTF-8を前提とした処理にShift_JISという悪しき習慣が紛れて処理が回らないというイージーミスは避けたいし、UTF-8にしてもUnicodeエスケープするのかしないのかは明示的に書きたい。また、実務上はgzip圧縮しての管理がよく出てくるため、圧縮形式としてのgzipの処理も重要。

 

以上、ざっくりしたまとめでした。プログラミングの世界は日々勉強ですね。

正直なところ、Pythonの特長はモジュール(ライブラリ)の豊富さにあるので、こういった基本的な処理だけであればGoで書いた方がパフォーマンスが大きく向上すると思うとGoで書いた方がいいんじゃないかと思いつつも、マーケット的にPython人材よりもGo人材の方が圧倒的に少ないうえに学習コストも高いことを考えるとビジネス的には非常に難しい判断どころなんだろうなと思う今日この頃です。

同じカテゴリーの投稿もどうぞ!
ConoHaのVPSを使うこのブログが突如使えなくなった後に復旧した話
ビジネス
2021/07/04
ConoHaのVPSを使うこのブログが突如使えなくなった後に復旧した話
業務のためにSaaSを選定するテックリサーチの思考の流れを言語化してみた
ビジネス
2021/05/01
業務のためにSaaSを選定するテックリサーチの思考の流れを言語化してみた
アジャイルとスクラムについて、原理原則と基本を押さえる【2020年12月版】
ビジネス
2020/12/10
アジャイルとスクラムについて、原理原則と基本を押さえる【2020年12月版】
IT&マーケティング界隈でプロジェクトマネージャーとして生き残るためのサバイバルハック【2020年9月版】
ビジネス
2020/09/16
IT&マーケティング界隈でプロジェクトマネージャーとして生き残るためのサバイバルハック【2020年9月版】
IT&マーケティング界隈で新卒入社者が安定して成長できるための働き方を考察してみた【2020年8月版】
ビジネス
2020/08/31
IT&マーケティング界隈で新卒入社者が安定して成長できるための働き方を考察してみた【2020年8月版】
ブログ著者について
那須野 拓実(なすの たくみ)。たなぐら応援大使(福島県棚倉町)。トリプレッソを勝手に応援する人。ネイチャーフォト中心の多言語ブログを書いてます。本業はIT&マーケティング界隈でナレッジマネジメントとかデータ分析とかの何でも屋。半年間の育休明けで、家事育児と外働きのバランスを模索中。