\ BLACK FRYDAY! /

業務系アプリケーションでよく使うPandas操作の基本

  • Pandas を使ってみたい!
  • DataFrame の取り扱い方に自信がない…

Pandas は内部的に C 言語で最適化されているので、Python の CSV モジュールなどと比べても超高速に動作します。

また、Pandas で使われる DataFrame には痒いところに手が届くようなメソッドが多数実装されているので、少ないコード量でデータ分析ができる超便利なライブラリです。

とはいえ DataFrame はコードの書き方にやや癖があるので、苦手意識やとっつきにくさを感じている方も多いと思います。

本記事ではPandasの基本操作をシンプルにご紹介していきます。

DataFrame として読み込む

すでにあるデータから DataFrame として読み込む方法から紹介します。

ここで取得した DataFrame オブジェクトに対して加工・集計を行なっていくことになるのでファーストステップですね。

引数にパラメーターを与えることで色々できますので、基本の使い方 => 応用的な使い方までご紹介します。

Excel ブック

ただ単に Excel ブックを読み込みたい場合は以下のコードです。

excel_path = 'new_book.xlsx'
sheet_name = 'Sheet1'

# Excel => DataFrame
df = pd.read_excel(excel_path, sheet_name=sheet_name)

DataFrame として読み込む場合にはシートを指定することに注意してください。(CSVはシートという概念がないのでsheet_nameがない)

エンコードの関係で文字化けする場合には、encoding引数でオプションを設定します。

excel_path = 'new_book.xlsx'
sheet_name = 'Sheet1'

# Excel => DataFrame
df = pd.read_excel(excel_path, sheet_name=sheet_name, encoding='utf-8_sig')

基本的にはutf-8_sigでいけますが、それでもダメな場合はANSIcp932を使ってみましょう。色々試してみてください。

CSV ファイル

CSVファイルを読み込む方法です。

csv_path = 'somefile.csv'

# CSV => DataFrame
df = pd.read_CSV(csv_path, encoding="utf-8_sig")

CSVファイルは文字化けの問題が多いので、基本的にはencodingで指定します。

データ整形

キーワードで絞り込み

基本的なデータの絞り込み方法は以下の通りです。

# 青森県を取得
df["都道府県"] = df[df["都道府県"] == "青森県"]

df["都道府県"] == "青森県"の部分ではTrueFalseのブール値が得られますので、これを外からdfで囲むとTrueのものだけが抽出できるというわけです。

逆にFalseのものだけで抽出したい場合には、以下のように~(チルダ)をつけます。

# 青森県以外を取得
df["都道府県"] = df[~df["都道府県"] == "青森県"]

数値で絞り込む

キーワードでの絞り込みと同様に、数値を比較演算子で繋げることで条件に合ったレコードを取得できます。

# 得点が80点以上のレコードを取得
df["得点"] = df[df["得点"] <= 80]

あるキーワードを含むレコードで絞り込む

isinメソッドを使うことで「含む」を表現できます。

# 「県」を含むレコードを取得
df["都道府県"] = df[df["都道府県"].isin(["県"])]

もちろん、「含まない」ということを表現する場合は~をつけることで実装可能です。

# 「県」を含むレコードを取得
df["都道府県"] = df[~df["都道府県"].isin(["県"])]

日時の操作

datetime型に変換する

日時に関するデータを読み込んだはずが文字列型で読み込まれていることがあります。

そんな時は、to_datetimeメソッドを使いましょう。

df["日時"] = pd.to_datetime(df["日時"])

timedelta型に変換する

時間計算などする場合にはtimedelta型に変換しておくと便利です。

df["時間"] = pd.to_timedelta(df["時間"])

年 / 月 / 日だけを抽出する

年・月・日など単体で要素を取り出したい場合、dtアクセサを使うとうまく抽出できます。

# 年だけ抽出
df["年"] = df["日時"].dt.year
# 月だけ抽出
df["月"] = df["日時"].dt.month
# 日だけ抽出
df["日"] = df["日時"].dt.day

日時で丸め / 切り捨て / 切り上げ

datetime型はミリ秒単位で情報があるとかえって扱いが煩雑になってしまうことがあるので、必要な範囲でデータを削ぎ落としておくと扱いがラクになります。

dtアクセサを使ってdatetimeっぽい形で編集できるようにするのがポイントです。

# 日時の丸め
df["日時"] = df["日時"].dt.round(freq="D")  # 日
df["日時"] = df["日時"].dt.round(freq="H")  # 時間
df["日時"] = df["日時"].dt.round(freq="15T")  # 15分

# 日時の切り捨て
df["日時"] = df["日時"].dt.floor(freq="D")  # 日
df["日時"] = df["日時"].dt.floor(freq="H")  # 時間
df["日時"] = df["日時"].dt.floor(freq="15T")  # 15分

# 日時の切り捨て
df["日時"] = df["日時"].dt.ceil(freq="D")  # 日
df["日時"] = df["日時"].dt.ceil(freq="H")  # 時間
df["日時"] = df["日時"].dt.ceil(freq="15T")  # 15分

roundに渡す引数freqはかなりの数が用意されているので、目的に合わせて公式ドキュメントを参照してみましょう。

» 参考:pandas Offset aliases

まとめ

Python でデータを扱う場合に比べてややクセはありますが、Pandas なら高速に少ないコード量でやりたいことが実現できます。

習得までには少し時間がかかるかもしれませんが、データを扱う場合に大きな力になってくれるライブラリです。

ぜひ、スラスラと書けるようになるまで使い込んでみてください。

この記事が気に入ったら
フォローしてね!

シェア・記事の保存はこちら!

この記事を書いた人

karo@プログラマのアバター karo@プログラマ プログラマ

「書くことで人の役にたつ」をモットーに活動中。
本職はプログラマで、Pythonが得意。
基本情報技術者試験合格。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)