こんにちは、えびかずきです。
今回は、Pandasの基本的な使い方について説明します。
こんな人におすすめ:
・Pythonでデータ処理を始めたのでPandasについて学びたい
・使い方をど忘れしたので確認したい
最近Pandasを使う機会がかなり多くなってきたので、自分のための備忘録としても、使い方を簡単にまとめておこうと思います。
開発環境
- Python 3.7.3
- Pandas 1.2.4
- NumPy 1.20.2
- scikit-learn 0.24.2(データの加工で使用)
- IDE: jupyter Notebook
Pandasはpipで以下のようにしてインストールできます。
$ pip install pandas
Pandasの基本的な使い方
ここでは、Pandasの基本的な使い方について実装例を見ながら説明していきます。
なお、それぞれのPythonコードは、前提として以下のライブラリがインポートされているものとします。
今回は、Pandasに加えてサブでNumPyも使います。
# Pandasのインポート
import pandas as pd
import numpy as np
Series(1次元データ)の操作
Pandasでは1次元のデータをpandas.Seriesクラスで扱います。
Seriesの作成
Seriesクラスは以下のように引数としてリストなどのイテラブルな配列を与えて作成します。
NumPyの配列を与えてもOKです。
# Seriesの作成
sample_list = [1,2,3,4,5]
# sample_list = np.array([1,2,3,4,5])
series = pd.Series(sample_list)
# jupyter Notebookで表示
series
DataFrame(2次元データ)の操作
Pandasでは2次元のデータをpandas.DataFrameクラスで扱います。
DataFrameの作成
# 2次元データの作成(DataFrame)
df = pd.DataFrame([['伊藤', 168, 64], ['山田', 161, 58], ['鈴木', 171, 62]],
columns=['Name', 'Height', 'Weight', ])
#jupyter Notebookで表示
df
CSVファイルの読み込み
CSVファイルからデータを読み込む場合は、以下のようにread_csv関数を使います。
# DataFrameの読み込み
df = pd.read_csv('df_test.csv')
CSVにラベルがないときは、namesを使って手動で指定できます。
#CSVにラベルがないときは、namesで指定する
df = pd.read_csv('df_test.csv',
names=['Name', 'Height', 'Weight'])
CSVファイルの書き込み
CSVファイルへの書き込み、以下のようにto_csvメソッドを使います。
日本語の場合は’cp-932’を使うのがおすすめです。そのほか’shift_jis’でもOK。
# DataFrameの書き出し
df.to_csv('write.csv', index=False, encoding='cp932')
先頭行の表示
先頭行を確認したい場合は、head関数を使います。
引数には、表示したい行数を入力します。ちなみにデフォルトは5行になっている。
逆に末尾行を表示したい場合には、tail関数を使います。
# 先頭行の表示
df.head(2)
列の追加
DataFrameに列を追加したい場合は、以下のようにします。
#列の追加
df['Blood'] = ['A', 'B', 'O']
#jupyter Notebookで表示
df
応用:演算してから列の追加
演算をかけた列を追加する場合は、以下のようにします。
# 演算結果を列として追加
df['BMI'] = df['Weight'] / (df['Height']/ (100))**2
#jupyter Notebookで表示
df
条件で絞り込み
DataFrameのデータを条件で絞り込む場合は以下のようにします。
ここでは、身長と体重に条件を付与しています。
# 条件で絞り込み
df_extruct = df[(df['Height'] >= 170) & (df['Weight'] >= 60)]
# jupyter Notebookで表示
df_extruct
欠損データ(NaN)の取り扱い
ここでは欠損データの取り扱いについて実装例をみていきます。
Pandasで言う欠損値(NaN)とは、np.nanや、Noneのことです。
まずは欠損値を含むDataFrameを作成します。
# DataFrameの作成
df = pd.DataFrame([['伊藤', np.nan, 64], ['山田', 161,None], ['鈴木', 171, 62]],
columns=['Name', 'Height', 'Weight', ])
#jupyter Notebookで表示
df
欠損値(NaN) を含む”行”を削除する場合
# 欠損値(NaN) を含む"行"を削除
df1 = df.dropna()
df1
欠損値(NaN) を含む”列”を削除する場合
# 欠損値(NaN) を含む"列"を削除
df2 = df.dropna(axis=1)
df2
欠損値(NaN)ではない値が3つ未満の”行”を削除する場合
# 欠損値(NaN)ではない値が3つ未満の"行"を削除
df3 = df.dropna(thresh=3)
df3
欠損値(NaN)ではない値の数に条件を付けて”行”を削除する場合
# 特定の列(身長)に欠損値(NaN)を含む"行"を削除
df4 = df.dropna(subset=["Height"])
df4
scikit-learnによるデータ加工
ここでは、scikit-learnを使ってデータを加工する方法について説明します。
まず、例として使用するDataFrameを作成します。
# DataFrameの作成
df = pd.DataFrame([['伊藤', 'A'], ['山田', 'B'], ['鈴木', 'O']],
columns=['Name', 'Blood' ])
df
ダミー変数への変換
質的データをダミー変数に変換するには、sci-kitlearnのLabelEncoderクラスを使います。
下のように、DataFrameからダミー変数に変換したい列を配列として取り出して、fit_transformメソッドで変換します。
# 質的データをダミー変数に変換
from sklearn.preprocessing import LabelEncoder
# LabelEncoderオブジェクトを生成
encoder = LabelEncoder()
# fit_transformメソッドで、Blood列をダミー変数に変える
values = encoder.fit_transform(df['Blood'])
df_dummy = df
df_dummy['Blood'] = values
#jupyter Notebookで表示
df_dummy
one hot表示に変換
データ分析をしていると質的データをダミー変数で表して、one hot表示で使いたい場面が出てきます。
その方法は以下のとおり、scikit-learnのOneHotEncoderを使います。
from sklearn.preprocessing import OneHotEncoder
# one-hot化
encoder = OneHotEncoder(categories='auto')
# 1次元配列を2次元配列に変換してからエンコードする
result = encoder.fit_transform(values.reshape(-1, 1))
# one-hotエンコーディングされたデータをDataFrameに変換
df_onehot = pd.DataFrame(result.toarray(),
columns=sorted(list(set(df['Blood']))))
df_onehot
まとめ
今回は、Pandasの基本的な使い方について説明しました。
Pythonでデータ分析をするなら、Pandasを使いこなすことは必須です。
データ分析の最中にいちいちPandasの使い方を調べているようでは日が暮れてしまうので、ある程度の使い方は頭に入れておきたいですね。
参考
記事作成にあたって、以下のURLが参考になりました。
pandas documentation/pandas公式ドキュメント
→左上の検索窓から使い方を調べられます。
pandasで欠損値NaNを除外(削除)・置換(穴埋め)・抽出/note.nkmk.me
→欠損値の取り扱いについて日本語でよくまとまっています。
コメントを書く