【入門】pandasの使い方|基本的な使い方を20分で攻略!
- Pandasってなんだ??最短で理解して、使えるようになりたいなぁ
- Pandasには便利な機能がたくさんあるのは知っているが、データ分析に必要不可欠なものから知りたい!!
本記事では、この悩みを解決していきます。
本記事では、Pandasでデータ解析を行う際に必要不可欠なものをまとめて紹介します。
ここで紹介するものを習得すれば、基本的にデータ分析で困ることはありません。
全体通して20〜30分程度習得することができるので参考にしてください。
当ブログでは単に機能を説明するだけでは実際の操作が理解しにくいと考え、サンプルデータを作成して、Pandasの操作を体験できるようにしています!
Pandasについて
Pandasとは、『表形式のデータを処理するためのライブラリ』です。
簡単にいうと、PythonでExcelのような処理を簡単に行うことができる機能を提供してくれます。
具体的には、以下のような特徴があります。
- 高速に操作可能なデーターフレーム(DataFrame)型
- データを柔軟に変形できる
- 高性能なデータフレーム(DataFrame)型のマージと結合
- 時系列データに特化した機能
詳しくは、公式ドキュメント(Pandasの公式ドキュメント)を参考にしてください。
Pandasのインポート
まずは、『Pandas』と『numpy』を以下のようにインストールしてください
import numpy as np
import pandas as pd
pandasは一般的に『pd』と名前をつけてインポートされます!
numpyは、本記事で使用する追加のライブラリです。
先にnumpyを学習してから、Pandasを理解した方が理解した方が良いので、『numpy??』という方は下記を参考に基本を理解してから読み進めてください!
Pandasのデータ構造の作り方
Pandasには、1次元データを扱う『Series型』と多次元のデータを扱う『DataFrame型』というデータ形式があります。
まずは、『Series型』と『DataFrame型』の作成方法を紹介します。
以下の手順で順番に説明していきます
- Series型の作成方法
- DataFrame型の作成方法
Series型の作成方法
Seriesの作り方は大きく分けて二つあります。
- 辞書型から作成
- 配列から作成
さらに、Series型からnumpyのndarray型に変換する方法を最後に紹介します。
辞書型から作成
まずは、辞書型からSeries型を作る方法を紹介します。
Seriesを辞書型から作成するためには、pd.Series()
の引数に辞書型を以下のように入力します。
series = pd.Series({'A': 100, 'B': 200, 'C': 300})
series
<output>
A 100
B 200
C 300
dtype: int64
配列から作成
リストやNumpyの配列からもSeries型を作成することができます。
# リストから作成
series1 = pd.Series([100, 200, 300])
# numpy配列から作成
series2 = pd.Series(np.array([100, 200, 300]))
print('list:\n', series1)
print('numpy:\n', series2)
<output>
list:
0 100
1 200
2 300
dtype: int64
numpy:
0 100
1 200
2 300
dtype: int64
インデックスを指定する場合は、index
という引数にリスト形式で与えます。
series1 = pd.Series([100, 200, 300], index=['A', 'B', 'C'])
series1
<output>
A 100
B 200
C 300
dtype: int64
Series型からndarray型への変換
Series型からnumpy配列のndarray型に変換する場合は、values
メソッドを使用します。
series = pd.Series({'A': 100, 'B': 200, 'C': 300})
series_numpy = series.values
series_numpy
<output>
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
DataFrame型の作成方法
多次元データを扱うDataFrame型も大きく分けて二つの作り方があります。
- 辞書型から作成
- 配列から作成
最後に、DataFrame型からnumpyのndarray型に変換する方法を紹介します。
辞書型から作成
Series型と同様に辞書からDataFrame型を作成することもできます。
具体的には、以下のように辞書を利用して作成することができます。
df = pd.DataFrame(
{'A' : [1, 4, 7], 'B' : [2, 5, 8], 'C' : [3, 6, 9]},
index = ['a', 'b', 'c'])
df
<output>
列ラベルが辞書型のKeyに対応します。
print()
関数を利用すると以下のように出力することができます。
df = pd.DataFrame(
{'A' : [1, 4, 7], 'B' : [2, 5, 8], 'C' : [3, 6, 9]},
index = ['a', 'b', 'c'])
print(df)
<output>
A B C
a 1 2 3
b 4 5 6
c 7 8 9
当ブログでは、特に見にくい場合を除いてprint()
関数による出力の結果を表示します。
配列から作成
Seriesと同様に2次元リストまたは、Numpy配列を渡して作成することができます。
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
index = ['a', 'b', 'c'],
columns = ['A', 'B', 'C'])
print(df)
<output>
A B C
a 1 2 3
b 4 5 6
c 7 8 9
DataFrameは、index
引数で行のラベルを設定し、columns
引数で列のラベルを指定します。
DataFrame型からndarray型への変換
DataFrame型もvalues
メソッドを利用することで、ndarray型に変換することができます。
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
index = ['a', 'b', 'c'],
columns = ['A', 'B', 'C'])
df_ndarray = df.values
df_ndarray
<output>
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
to_numpy()
メソッドを使用してもndarray配列に変換できます。
df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
index = ['a', 'b', 'c'],
columns = ['A', 'B', 'C'])
df_ndarray = df.to_numpy()
df_ndarray
<output>
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
現段階では、value
メソッドを使用しても、to_numpy()
を使用しても特に問題はないです。
データの基本情報を取り出す方法
ここでは、データ分析でよく使うメソッドを説明していきます。
- head : 最初の数行分を表示
- tail : 最後の数行分を表示
- shape : データフレームの形状を確認
- len : データフレームの行数を表示
- index : 行ラベルの確認
- columns : 列ラベルの確認
- isnull : 欠損値の確認
- info : データフレームの概要表示
- describe : 基本的な統計量をまとめて表示
まずは、データ分析を行うための具体例を作成します!
df = pd.DataFrame(
{'A' : [54, 65, 78, 89, 91, 55, 76],
'B' : [66, 45, 78, 98, 54, 55, 66],
'C' : [22, 56, 44, 66, 44, 59, 76],
'Type': [np.nan, 'b', 'a', 'c', 'a', 'b', 'b']},
index = ['math1', 'math2', 'english1', 'english2',
'physics', 'chemistry', 'society'])
print(df)
<output>
A B C Type
math1 54 66 22 NaN
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
A, B, C君の定期試験の結果だと思ってください(細かいことは気にしないでください笑笑)
head : 最初の数行分を表示
head
を利用することで、最初の数行分を表示します。
デフォルトでは、最初の5行が表示されます。
print(df.head())
<output>
A B C Type
math1 54 66 22 NaN
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
表示する行数は以下のように指定することができます。
print(df.head(3))
<output>
A B C Type
math1 54 66 22 NaN
math2 65 45 56 b
english1 78 78 44 a
tail : 最後の数行分を表示
tail
を使用することで、データの最後の数行分を表示することができます。
デフォルトでは、head
と同様に最後の5行分が表示されます。
print(df.tail())
<output>
A B C Type
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
また、head
と同様に引数を以下のように設定することで指定した行数分表示することができます。
print(df.tail(3))
<output>
A B C Type
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
shape: データフレームの形状を確認
shape
を利用することでデータフレームの形状を確認することができます。
print(df.shape)
<output>
(7, 4)
len : データフレームの行数を表示
len
関数を使用することでデータフレームの行数を表示することができます。
print(len(df))
<output>
7
index: 行ラベルの確認
index
を使用することで行ラベルを確認することができます。
print(df.index)
<output>
Index(['math1', 'math2', 'english1', 'english2', 'physics', 'chemistry',
'society'],
dtype='object')
columns: 列ラベルの確認
columns
を利用して列ラベルを確認することができます。
print(df.columns)
<output>
Index(['A', 'B', 'C', 'Type'], dtype='object')
isnull : 欠損値の確認
isnull
を使用することで欠損値が存在するかどうかを確かめることができます。
print(df.isnull())
<output>
A B C Type
math1 False False False True
math2 False False False False
english1 False False False False
english2 False False False False
physics False False False False
chemistry False False False False
society False False False False
このように欠損値の部分がTrue
となる配列を出力します。
一般的には、sum
メソッドと併用して、以下のように欠損値の数を数えることが多いです。
df.isnull().sum()
<output>
A 0
B 0
C 0
Type 1
dtype: int64
これは、Type
の列に欠損値が一個含まれることを意味します。
欠損値を処理する方法としては、以下の二つがあります。
- 欠損値を取り除く
- 欠損値を適切な値で埋める
この方法を簡単に紹介します。
dropna : 欠損値を取り除く
欠損値を取り除く場合は、dropna
を使用します。
print(df.dropna())
<output>
A B C Type
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
欠損値があったmath1
の行が取り除かれましたね。
ここで、注意していただきたいポイントがあります。
実は、このままdropna
を実行しても元のデータには反映されません。
print(df)
<output>
A B C Type
math1 54 66 22 NaN
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
実は、引数でinplace=True
と設定しないと元にデータに変更が反映されません。
inplace=True
を設定しないと元のデータに変更が反映しないという仕組みは、dropna
のみならず、データフレームをカスタマイズするメソッド・関数に共通しています。
今回は、欠損値を削除するのではなく、欠損値を埋めて以降の解説を進めます。
そのため、inplace=True
の設定は、次の『欠損値を適切な値で埋める』ときに実行します。
fillna : 欠損値を埋める
fillna
を使用することで欠損値を埋めることができます。
今回は、元のデータに変更を反映するために、inplace=True
を引数に追加します!
df['Type'].fillna('a', inplace=True)
print(df)
<output>
A B C Type
math1 54 66 22 a
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
特に理由はありませんが、欠損値を『a』で埋めました。
実際は、もう少しデータと睨めっこして埋める必要があることに注意してください!
今回は、inplace=True
を設定したため元のデータも変更を反映しています。
print(df)
<output>
A B C Type
math1 54 66 22 a
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
info : データフレームの概要表示
info
を利用することでデータフレームの概要を知ることができます。
df.info()
<output>
<class 'pandas.core.frame.DataFrame'>
Index: 7 entries, math1 to society
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 A 7 non-null int64
1 B 7 non-null int64
2 C 7 non-null int64
3 Type 7 non-null object
dtypes: int64(3), object(1)
memory usage: 600.0+ bytes
infoメソッドによってメモリ使用量(memory usage
)や各列の欠損値を除いたデータ数(non - null
)などの情報を一気に取得することができます。
describe : 基本的な統計量をまとめて表示
describe
は基本的な統計量をまとめて表示してくれる便利なメソッドです。
print(df.describe())
<output>
A B C
count 7.000000 7.000000 7.000000
mean 72.571429 66.000000 52.428571
std 15.064939 17.672955 17.624388
min 54.000000 45.000000 22.000000
25% 60.000000 54.500000 44.000000
50% 76.000000 66.000000 56.000000
75% 83.500000 72.000000 62.500000
max 91.000000 98.000000 76.000000
このように各列の平均値や最大値などの情報を一気に知ることができます。
データの要素を取り出す方法
ここからは、データフレームの要素を取り出す方法を説明していきます。
データフレームから要素を取り出す方法は大きく分けて三つあります。
データフレームから要素を取り出す方法
- ラベル名を指定して取り出す
loc
メソッドでラベル名を指定して取り出すiloc
メソッドでインデックス番号を指定して取り出す
どの方法も頻繁に使用されます。
三つの方法をそれぞれ具体例を使用して、理解できるように説明するので安心してください。
具体的には、以下の手順で説明します。
- 列を取り出す方法
- 行を取り出す方法
- 複数行・複数列を取り出す方法
- 特定の要素を取り出す方法
- 条件に合う要素を取り出す方法
列を取り出す方法
まずは、列を取り出す方法を紹介します。
列を取り出すには、先ほどの三つの方法で以下のように記述します。
print('列ラベルを使用して列を取得:\n', df['A'])
print('locを使用して列を取得:\n', df.loc[:, 'A'])
print('ilocを使用して列を取得:\n', df.iloc[:, 0])
<output>
列ラベルを使用して列を取得:
math1 54
math2 65
english1 78
english2 89
physics 91
chemistry 55
society 76
Name: A, dtype: int64
locを使用して列を取得:
math1 54
math2 65
english1 78
english2 89
physics 91
chemistry 55
society 76
Name: A, dtype: int64
ilocを使用して列を取得:
math1 54
math2 65
english1 78
english2 89
physics 91
chemistry 55
society 76
Name: A, dtype: int64
loc
, iloc
メソッドでは、Numpy Arrayのようにスライシングを利用して取り出します。
スライシングは、範囲の終端の値も含まれることに注意しましょう。
行を取り出す方法
行を取り出す場合、以下のようにloc
とiloc
を使用します。
print('locを使用して行を取得:\n', df.loc['math1', :])
print('ilocを使用して行を取得:\n', df.iloc[0, :])
<output>
locを使用して行を取得:
A 54
B 66
C 22
Type a
Name: math1, dtype: object
ilocを使用して行を取得:
A 54
B 66
C 22
Type a
Name: math1, dtype: object
複数行・複数列を取り出す方法
複数行・複数列を柔軟に取り出す場合も、loc
とiloc
メソッドが便利です。
具体例を以下に示します。
print('locを使用して取得:\n', df.loc['math2':'physics', ['A', 'C']])
print('ilocを使用して取得:\n', df.iloc[1:5, [0, 2]])
<output>
locを使用して取得:
A C
math2 65 56
english1 78 44
english2 89 66
physics 91 44
ilocを使用して取得:
A C
math2 65 56
english1 78 44
english2 89 66
physics 91 44
特定の要素を取り出す方法
データフレームの特定の値を取り出す場合はat
メソッドを使います。
df.at['math1', 'C']
<output>
22
loc
やiloc
メソッドを使用しても、特定の要素を取り出すことはできますが、at
メソッドの方が高速です。
条件に合う要素を取り出す方法
条件に合う要素を取り出す際には、loc
を使用するのが便利です。
loc
メソッドの引数に、条件と取り出したい列を以下のように指定します。
print("条件を指定して取り出す:\n", df.loc[df['A'] < 70, 'A'])
print("複数の条件を指定して取り出す:\n", df.loc[(df['A'] < 80) & (df['Type'] == 'a'), ['A', 'B']])
<output>
条件を指定して取り出す:
math1 54
math2 65
chemistry 55
Name: A, dtype: int64
複数の条件を指定して取り出す:
A B
math1 54 66
english1 78 78
データのカスタマイズ
次に、よく使用するデータフレームのカスタマイズ方法を紹介します。
具体的には、以下のカスタマイズを説明します。
- データの変更
- ラベル名の変更
- 列・行の削除
- データの追加
- データの要素を置換
- データの全要素に関数を適用
- 条件に当てはまらない要素を置き換える
- 条件に当てはまる要素を置き換える
データを変更
データの変更は、リスト同様に以下のように実行できます。
df.loc['math1', 'B'] = 100
print('データを更新:\n', df.head())
<output>
データを更新:
A B C Type
math1 54 100 22 a
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
ラベル名の変更
列ラベルや行ラベルを変更するには、rename
メソッドを利用します。
以下のように辞書のキーの部分に変更前のラベル名を入力して、値の部分に変更後のラベル名を入力してください。
# 列ラベルの変更
print('列ラベルの変更:\n', df.rename(columns={'C' : 'D'}))
# 行ラベルの変更
print('行ラベルの変更:\n', df.rename(index={'math1' : 'math3'}))
<output>
列ラベルの変更:
A B D Type
math1 54 66 22 a
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
行ラベルの変更:
A B C Type
math3 54 66 22 a
math2 65 45 56 b
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
inplace=True
と引数に設定することで、元のデータにも変更を反映することができます。
列・行の削除
列や行を削除する場合は、drop
メソッドを利用します。
# 列の削除
print('列を削除:\n', df.drop(columns=['C']))
# 行を削除
print('行を削除:\n', df.drop(index=['math2']))
<output>
列を削除:
A B Type
math1 54 100 a
math2 65 45 b
english1 78 78 a
english2 89 98 c
physics 91 54 a
chemistry 55 55 b
society 76 66 b
行を削除:
A B C Type
math1 54 100 22 a
english1 78 78 44 a
english2 89 98 66 c
physics 91 54 44 a
chemistry 55 55 59 b
society 76 66 76 b
データの追加
pandasでは、以下のように簡単にデータを追加することができます。
# 列を追加
df.loc[:, 'Total'] = df['A'] + df['B'] + df['C']
# 行を追加
df.loc['japanese'] = [55, 60, 51, 'a' ,166]
print(df)
データの要素を置換
データの要素を置換する際は、map
またはreplace
メソッドを使用します。
map
とreplace
メソッドには、以下のような違いがあります。
map
: 変更先がない場合は、欠損値(NaN
)となるreplace
変更先がない場合は、そのままの値が残る
以下、具体例を示します。
print('mapを使用:\n', df['Type'].map({'a' : 0, 'b' : 1}))
print('replaceを使用:\n', df['Type'].replace({'a' : 0, 'b' : 1}))
<output>
mapを使用:
math1 0.0
math2 1.0
english1 0.0
english2 NaN
physics 0.0
chemistry 1.0
society 1.0
japanese 0.0
Name: Type, dtype: float64
replaceを使用:
math1 0
math2 1
english1 0
english2 c
physics 0
chemistry 1
society 1
japanese 0
Name: Type, dtype: object
データの全要素に関数を適用
SeriesとDataFrameで全要素に関数を適用する方法は、異なります。
そのため順番に説明します。
Seriesの全要素に関数を適用
Seriesの全要素に関数を適用する場合は、先ほど利用したmap
または、apply
を使用します。
print('Seriesの全要素に適用(map) :\n', df['A'].map(lambda x: x/2))
print('Seriesの全要素に適用(apply) :\n', df['A'].apply(lambda x: x**2))
<output>
Seriesの全要素に適用(map) :
math1 27.0
math2 32.5
english1 39.0
english2 44.5
physics 45.5
chemistry 27.5
society 38.0
japanese 27.5
Name: A, dtype: float64
Seriesの全要素に適用(apply) :
math1 2916
math2 4225
english1 6084
english2 7921
physics 8281
chemistry 3025
society 5776
japanese 3025
Name: A, dtype: int64
DataFrameの全要素に関数を適用
DataFrameの全要素に関数を適用する場合は、applymap
メソッドを利用します。
print('DataFrameの全要素に適用:\n', df[['A', 'B', 'C']].applymap(lambda x: x/2))
<output>
DataFrameの全要素に適用:
A B C
math1 27.0 50.0 11.0
math2 32.5 22.5 28.0
english1 39.0 39.0 22.0
english2 44.5 49.0 33.0
physics 45.5 27.0 22.0
chemistry 27.5 27.5 29.5
society 38.0 33.0 38.0
japanese 27.5 30.0 25.5
条件に当てはらない要素を置き換える
where
メソッドを利用することで、条件に当てはまらない要素を置き換えることができます。
print(df.where(df[['A', 'B', 'C']] > 60, 0)[['A', 'B', 'C']])
<output>
A B C
math1 0 100 0
math2 65 0 0
english1 78 78 0
english2 89 98 66
physics 91 0 0
chemistry 0 0 0
society 76 66 76
japanese 0 0 0
この例は、60点を下回った要素を0に置き換える操作をしています。
条件に当てはまる要素を置き換える
mask
メソッドを利用することで、条件に当てはまる要素を置き換えることができます。
print(df.mask(df[['A', 'B', 'C']] <= 60, 0)[['A', 'B', 'C']])
<output>
A B C
math1 0 66 0
math2 65 0 0
english1 78 78 0
english2 89 98 66
physics 91 0 0
chemistry 0 0 0
society 76 66 76
先ほどと同様に、60点を下回る要素を0に置き換えました。
データの結合
ここからは、データフレームの結合方法を紹介します。
データフレームの結合方法を具体例を用いて確認するために以下の三つのデータフレームを準備します。
df1 = pd.DataFrame(
{'A' : [54, 65, 78, 89, 91, 55, 76],
'B' : [66, 45, 78, 98, 54, 55, 66],
'C' : [22, 56, 44, 66, 44, 98, 76],
'ID1' : ['a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a8']},
index = ['math1', 'math2', 'english1', 'english2',
'physics', 'chemistry', 'society'])
df2 = pd.DataFrame(
{'A' : [54, 65, 33, 88],
'E' : [66, 45, 32, 94],
'F' : [22, 56, 12, 78],
'ID2' : ['a4', 'a6', 'a7', 'a8']},
index = ['physics', 'japanese1', 'japanese2', 'society'])
df3 = pd.DataFrame(
{'D' : [34, 83, 21, 75, 96],
'E' : [69, 58, 94, 95, 16],
'ID1' : ['a0', 'a2', 'a3', 'a5', 'a8']},
index = ['math1', 'english1', 'english2',
'chemistry', 'society'])
concat : データフレームを結合
concat
関数を利用することで、DataFrameの結合を行うことができます。
引数のaxis
に0を指定すれば縦方向、1を指定すれば横方向に結合します(デフォルトは縦方向の結合 : axis=1
)
# デフォルトは縦に結合(axis=0)
print('縦に結合:\n', pd.concat([df1, df2]).tail())
# 縦に結合
print('縦に結合:\n', pd.concat([df1, df2], axis=0).tail())
# 横に結合
print('横に結合:\n', pd.concat([df1, df3], axis=1).head())
<output>
縦に結合:
A B C ID1 E F ID2
society 76 66.0 76.0 a8 NaN NaN NaN
physics 54 NaN NaN NaN 66.0 22.0 a4
japanese1 65 NaN NaN NaN 45.0 56.0 a6
japanese2 33 NaN NaN NaN 32.0 12.0 a7
society 88 NaN NaN NaN 94.0 78.0 a8
縦に結合:
A B C ID1 E F ID2
society 76 66.0 76.0 a8 NaN NaN NaN
physics 54 NaN NaN NaN 66.0 22.0 a4
japanese1 65 NaN NaN NaN 45.0 56.0 a6
japanese2 33 NaN NaN NaN 32.0 12.0 a7
society 88 NaN NaN NaN 94.0 78.0 a8
横に結合:
A B C ID1 D E ID1
math1 54 66 22 a0 34.0 69.0 a0
math2 65 45 56 a1 NaN NaN NaN
english1 78 78 44 a2 83.0 58.0 a2
english2 89 98 66 a3 21.0 94.0 a3
physics 91 54 44 a4 NaN NaN NaN
データが列は、欠損値NaN
となります。
merge : ある列をキーとして結合
merge
を使用することで、指定した列をキーにして結合することができます。
キーとする列は、引数on
で指定します。
また、結合方法は、引数how
を指定することで選択できます。
結合方法は、以下の4つがあります。
- inner merge : keyが一致する部分のみ結合
- outer merge : keyが一致しない部分は欠損値として結合
- left merge : 結合される側のkeyと一致する部分が結合
- right merge : 結合する側のkeyと一致する部分が結合
おそらく具体例を紹介した方が理解しやすいと思うので、具体例の動作を見てみましょう。
# keyを使用して結合(デフォルトはhow='inner')
print(df1.merge(df3, on='ID1'))
# 結合方法を指定
# inner merge
print('inner merge:\n', df1.merge(df3, on='ID1', how='inner'))
# outer merge
print('outer join:\n', df1.merge(df3, on='ID1', how='outer'))
# left merge
print('left join:\n', df1.merge(df3, on='ID1', how='left'))
# right merge
print('right join:\n', df1.merge(df3, on='ID1', how='right'))
<output>
A B C ID1 D E
0 54 66 22 a0 34 69
1 78 78 44 a2 83 58
2 89 98 66 a3 21 94
3 55 55 98 a5 75 95
4 76 66 76 a8 96 16
inner merge:
A B C ID1 D E
0 54 66 22 a0 34 69
1 78 78 44 a2 83 58
2 89 98 66 a3 21 94
3 55 55 98 a5 75 95
4 76 66 76 a8 96 16
outer join:
A B C ID1 D E
0 54 66 22 a0 34.0 69.0
1 65 45 56 a1 NaN NaN
2 78 78 44 a2 83.0 58.0
3 89 98 66 a3 21.0 94.0
4 91 54 44 a4 NaN NaN
5 55 55 98 a5 75.0 95.0
6 76 66 76 a8 96.0 16.0
left join:
A B C ID1 D E
0 54 66 22 a0 34.0 69.0
1 65 45 56 a1 NaN NaN
2 78 78 44 a2 83.0 58.0
3 89 98 66 a3 21.0 94.0
4 91 54 44 a4 NaN NaN
5 55 55 98 a5 75.0 95.0
6 76 66 76 a8 96.0 16.0
right join:
A B C ID1 D E
0 54 66 22 a0 34 69
1 78 78 44 a2 83 58
2 89 98 66 a3 21 94
3 55 55 98 a5 75 95
4 76 66 76 a8 96 16
結合するためのキーを各データフレームで別々に決定する場合は、left_on
, right_on
を利用します。
print(df1.merge(df2, left_on='ID1', right_on='ID2'))
<output>
A_x B C ID1 A_y E F ID2
0 91 54 44 a4 54 66 22 a4
1 76 66 76 a8 88 94 78 a8
デフォルトで、各データフレームに同じ列ラベルが存在する場合は、_x
, _y
といった下付き文字を利用して自動で区別されます。
下付き文字を変える場合は、引数suffixes
を設定してください。
print(df1.merge(df2, left_on='ID1', right_on='ID2', suffixes=('_left', '_right')))
A_left B C ID1 A_right E F ID2
0 91 54 44 a4 54 66 22 a4
1 76 66 76 a8 88 94 78 a8
また、行ラベルを使用して結合する場合は、left_index
, right_index
を使用します。
# 行ラベルを使って結合
print(df1.merge(df2, left_index=True, right_index=True))
<output>
A_x B C ID1 A_y E F ID2
physics 91 54 44 a4 54 66 22 a4
society 76 66 76 a8 88 94 78 a8
知っておく便利な設定
ここでは、知っておくと便利な設定を紹介します。
特に必須ではないので、ラフな気持ちで読んでください。
データフレームの表示数増加
# 行の最大表示数
pd.set_option('display.max_rows', 100)
# 列の最大表示数
pd.set_option('display.max_columns', 100)
# 列名で表示する最大文字数
pd.set_option("display.max_colwidth", 10000)
まとめ
本記事では、Pandasを用いたデータ分析に必要不可欠なものをまとめて紹介しました。
ここで紹介したものコードを利用することで、基本的なデータ解析はできるようになります。
また本記事は、高度なデータ分析の土台にもなります。
プログラミングは、自分でコーディングしないと上達しません。
皆さんも適当なデータフレームを作成し一度自分の手でデータ解析をしてみましょう。
『matplotlib』を利用したデータの可視化について知りたい方は下記を参考にしてください。
Pythonを学習するのに効率的なサービスを紹介していきます。
まず最初におすすめするのは、Udemyです。
Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。
また、セール中は1500円定義で利用することができ、コスパも最強です。
下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。
他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。
自分の学習スタイルに合わせて最適なものを選びましょう。
また、私がPythonを学ぶ際に使用した本を全て暴露しているので参考にしてください。