実務で使うpandas/DataFrame Tips


はじめに

機械学習をはじめとしたデータ分析では、データ前処理は必須であり、pandasをかなり使う。特に、テーブルデータを扱うDataFrameの使用頻度は極めて高い。
と言いつつ、いつも忘れてしまうので、ここでまとめます。

githubに実際のコードを挙げているので、参考にしてください。
https://github.com/andever-flatfish/pandas-tips/blob/master/notebook/pandas-tips.ipynb

まずは、以下のDataFrameを使って、各Tipsをする。

import pandas as pd

df = pd.DataFrame([['tokyo', 'male', 21, 165, 63],
                   ['osaka', 'male', 28, 170, 71],
                   ['fukuoka', 'female', 32, 175, 58],
                   ['tokyo', 'male', 21, 165, 63],
                   ['osaka', 'female', 28, 175, 70],
                   ['fukuoka', 'male', 32, 155, 58],
                   ['tokyo', 'female', 21, 165, 63],
                   ['osaka', 'male', 28, 172, 67],
                   ['fukuoka', 'male', 42, 155, 48]],
                   columns=['area', 'gender', 'age', 'height', 'weight'])

データの型の確認・型の変換

pythonは動的型付け言語なので、基本的に型を意識する必要はありません。ただ、想定外のことでエラーになることもよくあります。
例えば、int型だと思っていたデータが、1つのデータだけスペースが入っていて、object型になっているとかです。
そのような際には、以下でデータの型を確認しましょう。


df.dtypes
area      object
gender    object
age        int64
height     int64
weight     int64
dtype: object

1つのカラムのみ確認したい場合は、以下で確認できます。


df['height'].dtype
dtype('int64')

int型をfloat型に変換したい場合は、以下のようにすれば出来ます。
上記のdf['height'].dtypeで確認すると、変換されていることが分かります。


df['height'] = df['height'].astype(float)

ただし、object型をint型やfloat型に変換するには、object型になったデータ(例えばスペースとか)を修正か除去した上で、astypeで変換する必要があります。

DataFrameのカラム名の確認

DataFrameのカラム名を確認したいことはよくあります。さらに、カラムごとに何かの処理をしたい場合は、カラム名をリストで保持しておくと便利です。


df_columns = list(df.columns)
print(df_columns)
['area', 'gender', 'age', 'height', 'weight']

特定の行のデータのみ抽出する

ある特定の条件に当てはまるデータのみを行ごと抽出することができる。
例えば、dfの中で'area'が'fukuoka'のみのデータを抽出したい場合は、以下のように抽出できる。


part_of_df1 = df[df['area']=='fukuoka']

また、dfの中で'area'が'tokyo'もしくは'osaka'のデータを抽出したい場合は、以下のように抽出できる。


part_of_df2 = df[df['area'].isin(['tokyo', 'osaka'])]

nullのデータだけ抜き出したい場合は、以下のように書く。


part_of_df3 = df[df['area'].isnull()]

実業務ではnullのデータだけ抜き出したい場合よりも、nullでないデータを抜き出す場合の方が多いように思う。
nullでないデータを抜き出す場合は、以下のように書く。


part_of_df4 = df[~df['area'].isnull()]

インデックスの数字を振り直す

特定の行のデータのみ抽出すると、indexが元のDataFrameのindexのままなので、以下のようにindexを振り直す。


part_of_df1.reset_index(drop=True, inplace=True)

カラムの並び順の変更

DataFrameのカラムを並び順を変更したい場合は、並び替えたい順のカラムをリストにして、そのリストを呼べば良い。


sorted_columns_list1 = ['height', 'weight', 'gender', 'area', 'age']
sorted_df1 = df[sorted_columns_list1]

並び替えだけでなく、特定のカラムのみを抽出することもできる。


sorted_columns_list2 = ['area', 'gender', 'age']
sorted_df2 = df[sorted_columns_list2]

カラム名の変更

renameを使って、以下のようにカラム名を修正する。


rename_df = df.rename(columns={'area':'エリア',
                               'gender':'性別', 
                               'age':'年齢', 
                               'height':'身長', 
                               'weight':'体重'})

他のデータフレームをUnionする

同じカラム名の違うデータをunionする際には、appendを使う。


other_df = pd.DataFrame([['hokkaido', 'male', 25, 162, 60],
                         ['hokkaido', 'female', 38, 179, 81]],
                         columns=['area', 'gender', 'age', 'height', 'weight'])

union_df = df.append(other_df, ignore_index=True)

基本統計量を算出

numericalなデータを確認するには、基本統計量算出すると、外れ値などのあたりがつくこともある。


df.describe()

csvの読み込み・書き出し

以下のように、簡単にデータは読み込める。
dfが文字化けしている場合は、encodingを記載する。


df = pd.read_csv('data.csv') 

元のcsvにheaderがない場合は、以下のように記載する。


df = pd.read_csv('data.csv', header=None) 

以下のように出力も簡単にできる。
ただの連番のindexであれば、出力しないことが多い。


df.to_csv('data.csv', index=False)

あまり使わないが、headerも出力しない場合は、以下のように記載する。


df.to_csv('data.csv', header=False, index=False)