最近は、データ分析なんかを担当しているので、
awsのs3に散りばめられたcsvと格闘することが多いです。
それを処理するために主に使用する言語がpythonなのですが、
テキストデータを扱うためにpandasというライブラリを使用しています。
今回はpandasで僕が使用している機能とその使い方の
サンプルコードを記載しようかと思います。
pandasとは
公式によれば
pandas is a fast, powerful, flexible and easy to use open source data analysis and manipulation tool,
built on top of the Python programming language.
とのことで、高速で柔軟、かつ簡単にデータ分析や操作を行うための
オープンソースで、python上で構築されていますよ。
ということですね。
使い勝手は、sparkのDataFrameに似ているなー思いましたが、
よくよく考えたら、相互変換できるので、
sparkの方がリスペクトしている感じになるのかしら??
spark側はファイル出力でファイル名が決められないとか、
sparkのContext上でなければsparkのDataFrameは扱えない(まー当然ですね。)
など制約の上で使用しないといけません。
pandasは単体で使用できるので、
使いやすいというか、使えるシーンが結構あるなーという
印象を受けました。
pandasのインストール
インストールは例によってpipで行います。
pip install pandas
csvファイル読み込み
import pandas as pd df = pd.read_csv("sample.csv") print(df)
これを実行すると、全レコードの内容が出力されます。
hoge fuga piyo 0 abc def ghi 1 jkl mno pqr
ここではローカル環境のファイルを指定していますが、
s3プロトコル(S3://~)にも対応しています。
行ごとのデータ処理
行ごとにデータを処理するには、以下のようにします。
# 1行ごとにhogeだけ出力 for row in df.itertuples(): print(row.hoge) # 列指定ならこんなことも for data in df['hoge']: print(data)
csvファイル出力
csvファイル出力するには以下のようにします。
# csvファイル出力 df = pd.DataFrame() # <- これで空のDataFrameを作成 df['aaa'] = ['111', '222', '333'] # <- 列追加、およびデータ追加 df.to_csv("output.csv")
DataFrame結合
DataFrame同士を結合するには、以下のようにします。
# DataFrame結合 df = df.append(df2)
この場合、結合するDataFrame同士のカラムが自動でマージされます。
同一のカラム同士であれば、
hoge fuga piyo 0 abc def ghi 1 jkl mno pqr 0 abc def ghi 1 jkl mno pqr
のようになります
結合しただけだと、行番号の値が元のDataFrameのままになってしまうので、
振り直す場合は、
df = df.reset_index()
としておきましょう。
また、データ構成の全く違うDataFrame同士も結合できて、
df = pd.read_csv("sample.csv") df2 = pd.DataFrame() df2['aaa'] = ['111', '222', '333'] # <- aaaというカラムしかない df = df.append(df2) print(df) ---------------------------------- aaa fuga hoge piyo 0 NaN def abc ghi 1 NaN mno jkl pqr 0 111 NaN NaN NaN 1 222 NaN NaN NaN 2 333 NaN NaN NaN
このように各々のカラムがマージされて(SQLでいうunion allな感じ)
で出力されます。
sqlチックに
pd.merge(df1, df2, on="hoge", how="inner")
データ抽出
データ抽出には、queryメソッドを使うパターンや、DataFrameに直接
条件を指定するパターンがあります。
# AND条件 df = df.query("hoge == 'abc' and fuga == 'def'") df = df[(df.hoge == "abc") & (df.fuga == "def")] # OR条件 df = df.query("hoge == 'abc' or fuga == 'def'") df = df[(df.hoge == "abc") | (df.fuga == "def")] # in df = df.query("hoge in (1, 2, 3)") df = df[df["hoge"].isin([1,2,3])] # like(前方) df = df.query('hoge.str.startswith("e")', engine='python') df = df[df["hoge"].str.startswith('e')] # like(部分) df = df.query('hoge.str.contains("e")', engine='python') df = df[df["hoge"].str.contains('e')] # like(後方) df = df.query('hoge.str.endswith("e")', engine='python') df = df[df["hoge"].str.endswith('e')]
sqlを直接文字列で渡すことができるpandasqlなんていうライブラリもあります。
まとめ
正直、まだまだたくさん機能がありすぎて紹介しきれないところなのですが、
今回記載したメソッドがあれば、まずまず必要な処理は書くことができると思います。
深く機能をしればますます便利に使用できますので、
みなさんもぜひ使ってみてください。
それでは!!
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!