- 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
でいけますが、それでもダメな場合はANSI
やcp932
を使ってみましょう。色々試してみてください。
CSV ファイル
CSVファイルを読み込む方法です。
csv_path = 'somefile.csv'
# CSV => DataFrame
df = pd.read_CSV(csv_path, encoding="utf-8_sig")
CSVファイルは文字化けの問題が多いので、基本的にはencoding
で指定します。
データ整形
キーワードで絞り込み
基本的なデータの絞り込み方法は以下の通りです。
# 青森県を取得
df["都道府県"] = df[df["都道府県"] == "青森県"]
df["都道府県"] == "青森県"
の部分ではTrue
かFalse
のブール値が得られますので、これを外から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
はかなりの数が用意されているので、目的に合わせて公式ドキュメントを参照してみましょう。
まとめ
Python でデータを扱う場合に比べてややクセはありますが、Pandas なら高速に少ないコード量でやりたいことが実現できます。
習得までには少し時間がかかるかもしれませんが、データを扱う場合に大きな力になってくれるライブラリです。
ぜひ、スラスラと書けるようになるまで使い込んでみてください。
コメント