【python】pandasでデータを操作する

IT
スポンサーリンク

最近は、データ分析なんかを担当しているので、

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なんていうライブラリもあります。

 

 

 

まとめ

正直、まだまだたくさん機能がありすぎて紹介しきれないところなのですが、

今回記載したメソッドがあれば、まずまず必要な処理は書くことができると思います。

 

 

深く機能をしればますます便利に使用できますので、

みなさんもぜひ使ってみてください。

それでは!!

 

 

 

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

コメント

タイトルとURLをコピーしました