PythonのPandasでよく使う基本的な機能(たぶん)

PythonのPandasでよく使う基本的な機能(たぶん)

Pandasは非常に優れたライブラリーで、データフレームに対し色々なことができます。ただ、すべての機能を知り使いこなすのは至難の業です。

幸運なことに、よく利用する機能は決まっており(人によって違いとは思いますが……)、その機能を知り使いこなすだけで十分なケースも多々あります。

今回は、PythonのPandasでよく使う機能と思われるものを、幾つか紹介します。

データフレームの生成|DataFrame

Pandasでは、データフレーム形式のデータセットを扱います。先ずは、DataFrame関数でデータフレームを作ることから初めます。

以下、辞書形式のデータからデータフレームを作成する例です。

#
# 辞書形式のデータからデータフレームを作成する
#

# 辞書形式のデータ
dataset = {"col1" : [1,2,3,4,5],
           "col2" : [6,7,8,9,10],
           "col3" : [11,12,13,14,15]
          }

# データフレーム化
df = pd.DataFrame(dataset)

df #確認

 

以下、実行結果です。

 

以下、リスト形式のデータからデータフレームを作成する例です。

#
# リスト形式のデータからデータフレームを作成する
#

# 辞書形式のデータ
dataset = [[1, 6,11],
           [2, 7,12],
           [3, 8,13],
           [4, 9,14],
           [5,10,15]
          ]

# データフレーム化
df = pd.DataFrame(dataset,
                  columns = ["col1","col2","col3"])

df #確認

 

以下、実行結果です。

 

データの読み込み|read_csv

Pandasを活用した多くのデータ分析は、一からデータセットを作るのではなく、外部ファイルを読み込んで利用します。

以下、CSVファイルをデータフレームとして読み込む例です。read_csv関数でCSVファイルを読み込みます。

#
# CSVファイルをデータフレームとして読み込む
#

# 読み込むファイル名
file = "MMM.csv"

# CSVファイルの読み込み
df = pd.read_csv(file)

df #確認

 

ファイル名ではなく、データのあるURLを指定し読み込むこともできます。以下、コードです。

#
# CSVファイルをデータフレームとして読み込む
#

# 読み込むファイル名(データのあるURLを指定)
file = "https://www.salesanalytics.co.jp/4zdt"

# CSVファイルの読み込み
df = pd.read_csv(file)

df #確認

 

以下、実行結果です。

 

データの書き込み|to_csv

外部ファイルを読み込むのではなく、Pandasのデータフレームを外部ファイルとして保存することもあります。

以下、コードです。to_csv関数でCSVファイルとして書き出します。

#
# データフレームをCSVファイルとして保存
#

# 保存するCSVファイル名
file = "dataset.csv"

# CSVファイルとして保存
df.to_csv(file)

 

データセットのサイズ|shape

データフレームが何行何列なのか、サイズを確認することは多々あります。

以下、コードです。shapeメソッドでサイズを出力します。

df.shape

 

以下、実行結果です。(行数、列数)です。

 

データセットの一部を見る|head、tail、sample

データフレームの一部を確認することも多々あります。

以下、最初の方のレコード10行を見るときの例です。headメソッドで出力します。

# 最初の方のレコード10行
df.head(10)

 

以下、実行結果です。

 

以下、最後の方のレコード10行を見るときの例です。tailメソッドで出力します。

# 最後の方のレコード10行
df.tail(10)

 

以下、実行結果です。

 

以下、ランダムにレコード10行を見るときの例です。sampleメソッドで出力します。

# ランダムにレコード10行
df.sample(10)

 

以下、実行結果です。

 

各カラム(変数)のデータ型の確認|dtypes

データフレームの各カラム(変数)のデータ型も気になるところでしょう。

以下、コードです。dtypesメソッドで出力します。

df.dtypes

 

以下、実行結果です。

 

データセットのサマリー|info

型だけでなく、もう少し情報が欲しいときがあります。

データセットのサマリーです。以下、コードです。infoメソッドで出力します。

df.info()

 

以下、実行結果です。

 

データセットの基礎統計|describe

どのようなデータセットなのかを理解するには、生のデータセットを見るだけでなく、カラム(変数)の基礎統計(平均値など)を計算し見ることも大事です。

以下、コードです。describeメソッドで出力します。

df.describe()

 

以下、実行結果です。

 

グラフ化|plot

グラフで見ると、データのイメージが付きます。

以下、コードです。plotメソッドで出力します。

df.plot()

 

以下、実行結果です。

 

すべてのカラム(変数)がプロットされています。特定のカラム(変数)を指定しプロットします。

以下、コードです。

df["Sales"].plot()

 

以下、実行結果です。

 

カラム(変数)間の関係性をプロット(散布図)することもあります。

以下、コードです。

df.plot.scatter(x="Web", y="Sales")

 

以下、実行結果です。

 

並べ替え(ソート)|sort_values

データセットを並べ替え(ソート)です。sort_valuesメソッドで実施します。

以下、昇順例です。

# 昇順
df.sort_values(by="Sales")

 

以下、実行結果です。

 

以下、降順例です。

# 降順
df.sort_values(by="Sales", ascending=False)

 

以下、実行結果です。

 

複数のカラム(変数)の例です。

df.sort_values(by="Sales", ascending=False).sort_values(by="TVCM")

 

以下、実行結果です。

 

データ連結|concat、merge

2つのデータフレームの連結です。concat関数やmerge関数などで実施します。

縦の連結例です。

#
# 縦に連結
#

# データフレーム1
df1 = pd.DataFrame(
    {
        "col1" : [1,2,3,4,5],
        "col2" : [6,7,8,9,10],
        "col3" : [11,12,13,14,15]
    }
)

# データフレーム2
df2 = pd.DataFrame(
    {
        "col1" : [6,7],
        "col2" : [8,9], 
        "col3" : [1,2]
    }
)

# df1に縦にdf2を結合
df = pd.concat([df1, df2], axis=0)

df #確認

 

以下、実行結果です。

 

横の連結例です。

#
# 横に連結
#

# データフレーム1
df1 = pd.DataFrame(
    {
        "col1" : [1,2,3,4,5],
        "col2" : [6,7,8,9,10],
        "col3" : [11,12,13,14,15]
    }
)

# データフレーム2
df2 = pd.DataFrame(
    {
        "col4" : [16,17,18,19,20],
        "col5" : [21,22,23,24,25]
    }
)

# df1の横にdf2を結合
df = pd.concat([df1, df2], axis=1)

df #確認

 

以下、実行結果です。

 

横に連結するとき、あるカラム(変数)をキーに連結することもあります。

先ず、データフレームを生成します。

# データフレーム1
df1 = pd.DataFrame(
    {
        "Name": ["tanaka", "hayashi", "sato", "miura"],
         "Age": [33, 46, 25, 32],
        "City": ["sapporo", "nagoya", "sendai", "kagoshima"],
    }
)

# データフレーム2
df2 = pd.DataFrame(
     {
         "City": ["sapporo", "sendai", "nagoya"],
         "Population": [195, 108, 230]
     }
)

 

df1にCityをキーにdf2のデータを結合します。

# df1にCityをキーにdf2のデータを結合
df_merged1 = pd.merge(df1, df2, how="left", on="City")

df_merged1 #確認

 

以下、実行結果です。

 

df2にCityをキーにdf1のデータを結合します。

# df2にCityをキーにdf1のデータを結合
df_merged2 = pd.merge(df1, df2, how="right", on="City")

df_merged2 #確認

 

以下、実行結果です。

 

抽出|iloc、loc

データフレームの一部を抽出することは非常に多いです。ilocメソッドやlocメソッドなどで実施します。

抽出例は、先程生成した以下のデータフレームを使います。

df_merged1

 

特定の行と列を指定しデータを抽出します。ilocで何行目や何列目かを指定し抽出することができます。

df_merged1.iloc[3, 2]

 

PythonのPandasのフレームワークは、行や列は0,1,2,…と0から始まります。つまり、データフレームの一番左上のセルは、0行目かつ0列目となります。

以下、実行結果です。3行目かつ2列目です。

 

インデックス(レコード名やカラム名)で指定し抽出することも出来ます。

df_merged1.loc[3, "City"]

以下、実行結果です。

 

以下のようなコードでも問題ありません。同じ結果が得られます。

rows = [3]
cols = ["City"]

df_merged1.loc[rows, cols]

 

特定のセルではなく、範囲などでも指定できます。ilocの例です。

df_merged1.iloc[2:4, 1:3]

 

以下、実行結果です。

 

locの例です。同じ結果が得られます。

df_merged1.loc[[2,3], ["Age","City"]]

 

以下のようなコードでも問題ありません。同じ結果が得られます。

rows = [2,3]
cols = ["Age","City"]

df_merged1.loc[rows, cols]

 

すべての列やすべての行を指定するときは「:」で表現します。

すべての列を指定した例です。

df_merged1.iloc[2:4, :]

 

以下、実行結果です。

 

すべての行を指定した例です。

df_merged1.iloc[:, 1:3]

 

以下、実行結果です。

 

フィルタリング|df[条件]

ある条件に一致したデータを抽出します。条件を”[]”の中に記載します。

以下、カラム(変数)Ageが30より大きいデータを抽出するときの例です。

df_merged1[df_merged1.Age > 30]

 

以下、実行結果です。

 

特定の値を指定し条件にあったものを抽出することもできます。

# フィルター条件
filter_list = ["tanaka", "hayashi"]

# フィルタリングの実施
df_merged1[df_merged1.Name.isin(filter_list)]

 

以下、実行結果です。

 

複数の条件も指定できます。

df_merged1[
    (df_merged1.Age > 30) & 
    (df_merged1.Name.isin(filter_list))
]

 

以下、実行結果です。

 

NA(欠測値)以外という条件を指定するときは、次のようにします。

df_merged1[df_merged1["Population"].notna()]

 

以下、実行結果です。

 

カラム(変数)の一意な値リスト|unique

カラム(変数)がカテゴリカル変数(質的変数)の場合、一意な値のリストを作ることもあります。uniqueメソッドで出力します。

ここで、カテゴリカル変数(質的変数)の存在するデータセットである「アヤメ(iris)」のデータセットを先ず読み込みます。

以下、コードです。

# データの読み込み
df = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')

df #確認

 

実行結果です。speciesがカテゴリカル変数(質的変数)です。

 

カラム(変数)speciesの一意な値のリストを作ります。

df.species.unique()

 

以下、実行結果です。

 

グルーピング集計|groupby

あやめ(iris)の基礎統計量を見てみます。

df.describe()

 

以下、実行結果です。量的変数の基礎統計量です。

 

この基礎統計量を、カラム(変数)speciesの値別に集計するとき、groupbyメソッドを使います。

df.groupby("species").mean()

 

以下、実行結果です。

 

カラム(変数)のドロップ(除外)|drop

特定のカラム(変数)を抽出するとき、以下のようになります。

df["species"]

 

以下、実行結果です。

 

以下のコードでも、同様の結果が得られます。

df.species

 

逆に、特定のカラム(変数)を除外(drop)するとき、以下のようになります。dropメソッドを使います。

df_drop = df.drop(columns = ["species"])

df_drop #確認

 

以下、実行結果です。

 

行方向に集計|sum(axis = 1)

先程の基礎郎計量などは、カラム(変数)ごとの集計、つまり列方向の集計でした。

列方向の集計を明示的に表現するとき、以下のように「axis = 0」と指定します。

# 列方向に集計
df_drop.sum(axis = 0)

 

以下、実行結果です。

 

行方向の集計例です。「axis = 1」と指定します。

# 行方向に集計
df_drop.sum(axis = 1)

 

以下、実行結果です。

 

カラム(変数)へ関数適用

定義した関数をカラム(変数)に適用することもできます。applyメソッドで実施します。

# 関数定義
def f(num):
    return num*num

# 関数適用
df_drop.sepal_length.apply(f)

 

以下、実行結果です。

 

新規カラム(新規変数)の追加|df[新しいカラム名]

元のデータフレームから計算し、それを新たなカラム(変数)として追加することも少なくありません。

行方向で合計した値を、新たなカラム(変数)(sum_col)として、元のデータフレームに追加します。

df_drop["sum_col"] = df_drop.sum(axis = 1)

df_drop #確認

 

以下、実行結果です。

 

さらに、先程定義した関数をカラム(変数)sepal_lengthに適用し、新たなカラム(変数)(sepal_length^2)として追加します。

df_drop["sepal_length^2"] = df_drop.sepal_length.apply(f)

df_drop #確認

 

以下、実行結果です。

 

カラム(変数)名の変更|rename

カラム(変数)名を分かりやすく変更することも多いです。renameメソッドで実施します。「:」の左側に変更前のカラム(変数)名、「:」の右側に変更後のカラム(変数)名を指定します。

df_drop.rename(columns = {
    "sepal_length":"A",                          
    "sepal_width":"B",                          
    "petal_length":"C",                          
    "petal_width":"D",                          
    "sum_col":"E", 
    "sepal_length^2":"F"
})

 

以下、実行結果です。

 

まとめ

今回は、PythonのPandasでよく使う機能と思われるものを、幾つか紹介しました。