はじめに
機械学習をはじめとしたデータ分析では、データ前処理は必須であり、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)