こんにちは。統計検定2級を勉強中のエンジニアです。
今回は、
pythonでデータ操作を扱うのに便利なフレームワークpandasの、
DataFrameのメソッドについての備忘録です。
まず事前に
import pandas as pd
として、
pandasをインポートしておきます。
# DataFrameへCSVを読込
df = pd.read_csv('hogehoge.csv')
# テキストベースで出力
print(df)
# 罫線付きで出力
display(df)
# 範囲指定
df1 = df.query('10 <= columnName < 20')
# SQLのinの様に使えます
df2 = df.query('columnName in ["NY", "TX"]')
# 特定の文字列を含む
df3 = df.query('columnName.str.contains("hoge")', engine='python')
# 正規表現による抽出
df4 = df.query('columnName.str.match(".*i.*e")', engine='python')
# None, NaNの除外
df5 = df.dropna()
# None, NaNの置換(0で置換)
df6 = df.fillna(0)
# 変数の埋め込み
val = 100
df7 = df.query('columnName > @val')
# AND条件
df8 = df.query('columnName1 < 25 and columnName2 > 65')
# 元のオブジェクト自体も変更(参照渡し)
df9 = df.query('age_year > 25', inplace=True)
また、query()メソッドで式を評価するエンジンとして、
pythonとnumexprの2種類が使えるそうです。
(デフォルトではpython)
今回はnumexprは使用していませんが
膨大なデータを扱う場合にはnumexprの方が処理が早くなるそうです。
numexprを使用する場合、
別途pipなどでインストールをして
queryの引数でengine='numexpr'
と指定してやります。
また、文字列メソッドではengine='python'
しか使えないそうです。
詳細については、参考のリンク先をご覧ください。
# 列を加工
df['value'].apply(lambda x: x ** 2)
# 列を追加
df.assign(square=(df['value'] ** 2).astype(float))
# 行へ加工
df.apply(lambda x: x-x.min(), axis=1)
# 全要素へ加工
df.apply_map(lambda x: x ** 2)
# Seriesの全要素へ加工
srs.map(lambda x: x ** 2)
# プログレスパー表示版
# tqdmはアラビア語でprogress
# 特にdfのaxis=1は重く、表示してあげると使用感が良くなります
from tqdm import tqdm
tqdm.pandas()
df['square'] = df['value'].progress_apply(lambda x: x ** 2, axis=1).astype(float)
C#のLINQ使いとしてはラムダ式使える書き方は嬉しい。
forでグルグルやるより、直感的で可読性高いですね。
プログレスパーが表示できるってのも面白いですね
ループ処理についてはこちらをご覧ください
pythonのループ処理についての備忘録
参考
note.nkmk.me -pandas.DataFrameの行を条件で抽出するquery-
[note.nkmk.me -pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出-]
(https://note.nkmk.me/python-pandas-nan-dropna-fillna/)
apply関数を使って列ごとや行ごとに関数を適用する