😎

[Pandas] DataFrameの使い方

2023/07/02に公開

DataFrameでは、表形式のデータを加工することができるライブラリです。
このライブラリの主な使い方を見ていきましょう!

DataFrameでhead()、tail()を使用した参照

DataFrameのデータを確認する際にPrint文を実行すると、以下のように前後5行しか表示してくれません。

import pandas as pd
import numpy as np

df = pd.read_csv("test_dir/df_test.csv") # ファイル読み込み

print(df)

>>>出力結果
0 shinjuku apple 500 2
1 shinjuku orange 600 5
2 shibuya banana 400 3
3 shinjuku banana 800 6
4 shinjuku apple 550 4
.. ... ... ... ...
145 shibuya grape 700 5
146 shibuya orange 450 2
147 shibuya grape 550 3
148 shinjuku banana 600 3
149 shibuya banana 800 8

しかし、headメソッドを使用することで、指定した行数表示させることが可能になります。

print(df.head(10))

>>>出力結果
      store   product  price  quantity
0  shinjuku    orange    598         1
1  shinjuku    banana    450         4
2   shibuya    orange    396         3
3  shinjuku    banana    976         7
4  shinjuku    orange    914         6
5   shibuya     grape    678         2
6  shinjuku    banana    782         9
7   shibuya    orange    540         5
8   shibuya    banana    423         2
9  shinjuku  pineapple    892         4

headメソッドは上からの行数分のデータを表示するのに対して、tailメソッドは下からの行数分のデータを表示するのに使用します。

メソッド.Tを使ってみる

.Tを使うと行方向と列方向が転置されます

例えば、先ほどと同じデータを用いるとしてhead().Tメソッドを使用してみましょう!

print(df.head().T)

>>>出力結果
               0         1        2         3         4
store    shinjuku  shinjuku  shibuya  shinjuku  shinjuku
product    orange    banana   orange    banana    orange
price         598       450      396       976       914
quantity        1         4        3         7         6

メソッドlocを用いてデータ参照

locメソッドを使用することで、指定の行と列のデータを抽出することができます。
例えば、インデックス番号1と2の行と、productとpriceの列を抽出したい場合は以下のように書きます

print(df.loc[1:2,"product":"price"])

すると以下の部分だけを抽出することが可能です

条件でフィルタリングしてみる

DataFrameのデータから条件に合致するものだけ抽出するということができます。
SQL文でいうところのWhere句になります。

dfの後の[]のなかに条件を指定します。
例えば[df["price"]>500]でpriceが500以上のものという条件が加わります。

print(df[df["price"]>500])

>>>出力結果
      store   product  price  quantity
0  shinjuku    orange    598         1
3  shinjuku    banana    976         7
4  shinjuku    orange    914         6
5   shibuya     grape    678         2
6  shinjuku    banana    782         9
7   shibuya    orange    540         5
9  shinjuku  pineapple    892         4

DataFrameのデータをソートしてみよう

DataFrameのデータはsort_valuesメソッドでカラムを指定してソートすることができます。
例えば、df.sort_values(by="カラム名", ascending=True)とすることで特定のカラムで昇順にソートすることが可能です。

ascending=False は降順になります。

df.sort_values(by="price", ascending=True)

      store   product  price  quantity
2   shibuya    orange    396         3
8   shibuya    banana    423         2
1  shinjuku    banana    450         4
7   shibuya    orange    540         5
0  shinjuku    orange    598         1
5   shibuya     grape    678         2
9  shinjuku     apple    892         4
6  shinjuku    banana    782         9
4  shinjuku    orange    914         6
3  shinjuku    banana    976         7

DataFrameのレコード追加をやってみよう

df.appendメソッドでレコードを追加することができます。
df.append(series, ignore_index=True)で新しいレコードを追加することができます。
ここではseriesを追加していますが、seriesを追加する

series = pd.Series(
    {"store": "shibuya", "product": "peach", "price": 900, "quantity": 2})  # Seriesの作成
df = df.append(series, ignore_index=True)  # 非破壊なメソッドなのでイコールを用いて上書き

print(df) #レコード追加ごとのdfを表示

>>>出力結果

      store   product  price  quantity
0  shinjuku    orange    598         1
1  shinjuku    banana    450         4
2   shibuya    orange    396         3
3  shinjuku    banana    976         7
4  shinjuku    orange    914         6
5   shibuya     grape    678         2
6  shinjuku    banana    782         9
7   shibuya    orange    540         5
8   shibuya    banana    423         2
9  shinjuku  pineapple   892         4
10 shibuya     peach     900         2

DataFrameのカラム追加をやってみよう

DataFrameのカラムの追加は

DataFrameの変数["新たなカラム名"]=リスト or Series

で実施することが可能です。

例えば、先ほどのDataFrameに追加で次のようなコードを実行してみましょう

df["day"] = ["Sunday","Saturday","Wednesday","Thursday",Monday","Monday","Tuesday",Friday","Saturday","Wednedday"]

print(df)
>>>出力結果
       store   product  price  quantity        day
0   shinjuku    orange    598         1     Sunday
1   shinjuku    banana    450         4   Saturday
2    shibuya    orange    396         3  Wednesday
3   shinjuku    banana    976         7   Thursday
4   shinjuku    orange    914         6     Monday
5    shibuya     grape    678         2     Monday
6   shinjuku    banana    782         9    Tuesday
7    shibuya    orange    540         5     Friday
8    shibuya    banana    423         2   Saturday
9   shinjuku  pineapple    892         4  Wednesday
10   shibuya     peach    900         2  Wednesday

dayというカラムが追加されたことが確認できました。

DataFrameのレコードの削除

dropメソッドを使用してDataFrameのレコードを削除することができます。

早速具体例を見た方が早いのでサンプルコードで確認してみましょう!
前項でのdfのデータをそのまま使っていることを前提にします。

df = df.drop(range(0, 2)) # インデックス0と1のレコードを削除

>>>出力結果
       store   product  price  quantity        day
2    shibuya    orange    396         3  Wednesday
3   shinjuku    banana    976         7   Thursday
4   shinjuku    orange    914         6     Monday
5    shibuya     grape    678         2     Monday
6   shinjuku    banana    782         9    Tuesday
7    shibuya    orange    540         5     Friday
8    shibuya    banana    423         2   Saturday
9   shinjuku  pineapple    892         4  Wednesday
10   shibuya     peach    900         2  Wednesday

DataFrameのカラムの削除

カラムの削除はdrop("削除対象のカラム", axis=1)で削除することができます。

こちらもサンプルコードを見てみましょう!

df = df.drop("store", axis=1)  # カラムstoreの削除

>>>出力結果

      product  price  quantity       day
0     orange    598         1     Sunday
1     banana    450         4   Saturday
2     orange    396         3  Wednesday
3     banana    976         7   Thursday
4     orange    914         6     Monday
5      grape    678         2     Monday
6     banana    782         9    Tuesday
7     orange    540         5     Friday
8     banana    423         2   Saturday
9   pineapple    892         4  Wednesday
10     peach    900         2  Wednesday

要約統計量を表示する

df.describeメソッドで平均値、最大値、最小値などの要約統計量データをまとめて出してくれます。

早速具体例を見てみましょう!
先ほどのDataFrameのデータに対して、df.describeを実施した例になります。

print(df.describe())

>>>出力結果
            price   quantity
count   10.000000  10.000000
mean   681.900000   4.300000
std    217.202066   2.494438
min    396.000000   1.000000
25%    504.750000   2.250000
50%    640.000000   4.000000
75%    875.000000   5.750000
max    976.000000   9.000000

DataFrameのグループ化

DataFrameではSQLと同様Group化も可能です。

df.groupby('グループ化したい列').計算関数())

でグループ化することが可能です!

print(df.groupby('store').max()) #storeごとにpriceとquantityのMax値を表示

>>>出力結果
          price  quantity
store                    
shibuya    1200         5
shinjuku   1250         5
yokohama    800         1

DataFrameの連結

今までは一つのDataFrameを想定してデータ加工の仕方を学びましたが、実際にデータを加工する場合には一つのDataFrameだけでなく複数のデータを用いれ分析や機械学習をすることが多いかと思います。

その際に複数のDataFrame同士を一定の方向についてそのままつなげる操作を連結と呼びます。
concatメソッドを使って連結することができます。

pd.concat([連結するDataFrameのリスト], axis= 0 or 1)

引数にaxis=0を渡すとインデックス方向(行方向に)、axis=1を渡すとカラム方向(列方向に)に連結されます。

DataFrameの結合

DataFrameの結合はmerge関数を用いて記述します。

import pandas as pd
pd.merge(左のDataFrame, 右のDataFrame, on = "keyにするカラム名", how="結合の種類")

結合の種類の箇所に
内部結合の場合 "inner"
左外部結合の場合 "left"
右外部結合の場合 "right"
完全外部結合の場合 "outer"
と記述することで結合の種類を分けることができる。

まとめ

本記事ではDataFrameの基本的な使い方を抑えていきました。
ほとんどSQL文でできそうなことをDataFrameを使ってできるというものになります。
pythonでデータ加工などをしたいときには便利そうですね。
このデータを使った計算処理などはNumpyにお任せすることができます。

Discussion