Pandas PR

【入門】pandasの使い方|基本的な使い方を20分で攻略!

記事内に商品プロモーションを含む場合があります

【入門】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??』という方は下記を参考に基本を理解してから読み進めてください!

 

【入門】numpyの使い方|15分で徹底攻略!機械学習やデータ解析をいち早く行うために、numpyに関する基本事項を体系的にまとめました。15分程度で読めるので、この記事でnumpyの基本を習得し、次のステップに進みましょう。...

 

 

Pandasのデータ構造の作り方

 

Pandasには、1次元データを扱う『Series型』多次元のデータを扱う『DataFrame型』というデータ形式があります。

まずは、『Series型』と『DataFrame型』の作成方法を紹介します。

以下の手順で順番に説明していきます

  1. Series型の作成方法
  2. DataFrame型の作成方法

 

Series型の作成方法

 

Seriesの作り方は大きく分けて二つあります。

  1. 辞書型から作成
  2. 配列から作成

さらに、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型も大きく分けて二つの作り方があります。

  1. 辞書型から作成
  2. 配列から作成

 

最後に、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()を使用しても特に問題はないです。

 

 

データの基本情報を取り出す方法

 

ここでは、データ分析でよく使うメソッドを説明していきます。

  1. head : 最初の数行分を表示
  2. tail : 最後の数行分を表示
  3. shape : データフレームの形状を確認
  4. len : データフレームの行数を表示
  5. index : 行ラベルの確認
  6. columns : 列ラベルの確認
  7. isnull : 欠損値の確認
  8. info : データフレームの概要表示
  9. 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メソッドでインデックス番号を指定して取り出す

 

どの方法も頻繁に使用されます。

三つの方法をそれぞれ具体例を使用して、理解できるように説明するので安心してください。

具体的には、以下の手順で説明します。

  1. 列を取り出す方法
  2. 行を取り出す方法
  3. 複数行・複数列を取り出す方法
  4. 特定の要素を取り出す方法
  5. 条件に合う要素を取り出す方法

 

列を取り出す方法

 

まずは、列を取り出す方法を紹介します。

列を取り出すには、先ほどの三つの方法で以下のように記述します。

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

 

locilocメソッドでは、Numpy Arrayのようにスライシングを利用して取り出します。

スライシングは、範囲の終端の値も含まれることに注意しましょう。

 

行を取り出す方法

 

行を取り出す場合、以下のようにlocilocを使用します。

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

 

 

複数行・複数列を取り出す方法

 

複数行・複数列を柔軟に取り出す場合も、locilocメソッドが便利です。

具体例を以下に示します。

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

 

locilocメソッドを使用しても、特定の要素を取り出すことはできますが、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

 

 

 

データのカスタマイズ

 

次に、よく使用するデータフレームのカスタマイズ方法を紹介します。

具体的には、以下のカスタマイズを説明します。

  1. データの変更
  2. ラベル名の変更
  3. 列・行の削除
  4. データの追加
  5. データの要素を置換
  6. データの全要素に関数を適用
  7. 条件に当てはまらない要素を置き換える
  8. 条件に当てはまる要素を置き換える

 

 

 

データを変更

 

データの変更は、リスト同様に以下のように実行できます。

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メソッドを使用します。

mapreplaceメソッドには、以下のような違いがあります。

  • 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_onright_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_indexright_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』を利用したデータの可視化について知りたい方は下記を参考にしてください。

【15分】Pythonでグラフを作成する方法|matplotlibの基本をマスターPythonでグラフを書くことが難しそうだと思っていませんか?実は、Pythonを使用したグラフ作成は、excelより便利で簡単です。この記事では、初心者でもグラフが書けるように丁寧にpythonのグラフの作成法を説明します。...
ABOUT ME
努力のガリレオ
【運営者】 : 東大で理論物理を研究中(経歴)東京大学, TOEIC950点, NASA留学, カナダ滞在経験有り, 最優秀塾講師賞, オンライン英会話講師試験合格, ブログと独自コンテンツで収益6桁達成 【編集者】: イングリッシュアドバイザーとして勤務中(経歴)中学校教諭一種免許取得[英語],カナダ留学経験あり, TOEIC650点
Python学習を効率化させるサービス

 

Pythonを学習するのに効率的なサービスを紹介していきます。

まず最初におすすめするのは、Udemyです。

Udemyは、Pythonに特化した授業がたくさんあり、どの授業も良質です。

また、セール中は1500円定義で利用することができ、コスパも最強です。

下記の記事では、実際に私が15個以上の講義を受講して特におすすめだった講義を紹介しています。

 

【最新】UdemyでおすすめのPythonコース|東大生が厳選!10万を超える講座があるUdemyの中で、Pythonに関係する講座を厳選しました。また、本記事では、Udemyを使用しながらPythonをどのような順番で勉強するべきかを紹介しました。ぜひ参考にしてください。...

 

他のPythonに特化したオンライン・オフラインスクールも下記の記事でまとめています。

 

【最新】Pythonに強いプログラミングスクール7選|東大生が厳選Pythonの流行と共に、Pythonに強いプログラミングスクールが増えてきました。本記事では、特にPythonを効率的に学ぶことができるプログラミングスクールを経験をもとに厳選して、内容を詳しく解説しています。...

 

自分の学習スタイルに合わせて最適なものを選びましょう。

また、私がPythonを学ぶ際に使用した本を全て暴露しているので参考にしてください。