LoginSignup
8
11

More than 3 years have passed since last update.

実務で使うpandas/DataFrame Tips

Last updated at Posted at 2019-12-17

はじめに

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

sample_df.png

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

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']

part_of_df.png

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


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

part_of_df2.png

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)

reset_index_part_of_df.png

カラムの並び順の変更

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


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

sorted_df1.png

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


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

sorted_df2.png

カラム名の変更

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


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

rename_df.png

他のデータフレームを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)

union_df.png

基本統計量を算出

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


df.describe()

numerical_data.png

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)
8
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
11