pandasの基本 Seriesとは
Seriesは一次元のデータ扱うためのに用いられます。
サンプルコードを見てみましょう。
>>> import pandas as pd >>> ser = pd.Series([1,2,3],index=["A","B","C"]) >>> ser A 1 B 2 C 3 dtype: int64
左のABCがindex、右の値が要素(value)です。
DataFrameとは
行と列にラベルを持った二次元データです。
サンプルコードを見てみます。
>>> import pandas as pd >>> df = pd.DataFrame([[1,2,3], [4,5,6]],index=["R1", "R2"],columns=["C1","C2","C3"]) >>> df C1 C2 C3 R1 1 2 3 R2 4 5 6
データの中身をみる
以下のようなDataFrameを使って説明していきます。
>>> df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9],[10,11,12]],index=["R1", "R2","R3","R4"],columns=["C1","C2","C3"]) >>> df C1 C2 C3 R1 1 2 3 R2 4 5 6 R3 7 8 9 R4 10 11 12
head : データの上の行から参照
headメソッドを使うとデータの上の行からデータを表示します。
引数を与えれば、上から引数分参照し、
引数がなければ、上から5つ参照します。
>>> df.head(2) C1 C2 C3 R1 1 2 3 R2 4 5 6
tail : データの下の行から参照
headメソッドを使うとデータの下の行からデータを表示します。
引数を与えれば、下から引数分参照し、
引数がなければ、下から5つ参照します。
>>> df.tail(2) C1 C2 C3 R3 7 8 9 R4 10 11 12
values : データの中身のみ参照
valuesはデータの中身だけ(index, columnなし)を参照します。
>>> df.values array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])
index : indexの参照
DataFrameのindexを参照します。
>>> df.index Index(['R1', 'R2', 'R3', 'R4'], dtype='object')
columns : columnの参照
DataFrameのcolumnを参照します。
>>> df.columns Index(['C1', 'C2', 'C3'], dtype='object')
describe : データの簡易的な統計データの表示
データの簡易的な統計データを出力します。
>>> df.describe() C1 C2 C3 count 4.000000 4.000000 4.000000 mean 5.500000 6.500000 7.500000 std 3.872983 3.872983 3.872983 min 1.000000 2.000000 3.000000 25% 3.250000 4.250000 5.250000 50% 5.500000 6.500000 7.500000 75% 7.750000 8.750000 9.750000 max 10.000000 11.000000 12.000000
カラム毎の統計データが出力されていることがわかります。
ちなみに、引数include、excludeなどを指定すれば、
さらに細かく要素を指定して統計データを表示することができます。
include、excludeに関しては以下のdocumentを参照してください。
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.describe.html
データの抽出
whereメソッド
以下のDataFrameを使ってwhereメソッドを試します。
>>> df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9],[10,11,12]],index=["R1", "R2","R3","R4"],columns=["C1","C2","C3"]) >>> df C1 C2 C3 R1 1 2 3 R2 4 5 6 R3 7 8 9 R4 10 11 12
このDataFarmeから5より大きい要素だけwhereメソッドを使って取り出してみます。
>>> df.where(df > 5) C1 C2 C3 R1 NaN NaN NaN R2 NaN NaN 6.0 R3 7.0 8.0 9.0 R4 10.0 11.0 12.0
次にC1列が5より大きい行を取り出します。
>>> df.where(df["C1"] > 5) C1 C2 C3 R1 NaN NaN NaN R2 NaN NaN NaN R3 7.0 8.0 9.0 R4 10.0 11.0 12.0
loc
DataFrameの行の抽出を行います。
(indexが整数以外の時も使える)
>>> df = pd.DataFrame([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], index=["R1", "R2","R3","R4"], columns=["C1","C2","C3"]) >>> df C1 C2 C3 R1 1 2 3 R2 4 5 6 R3 7 8 9 R4 10 11 12 >>> df.loc["R2"] # R2行の抽出 C1 4 C2 5 C3 6 Name: R2, dtype: int64 >>> df.loc[["R2","R4"]] # R2, R4行の抽出 C1 C2 C3 R2 4 5 6 R4 10 11 12
iloc
DataFrameの各行や要素を取り出す時に用います。
iはintengerのi、indexの行数を指定して取り出します。
サンプルコードを見ていきます。
>>> df C1 C2 C3 R1 1 2 3 R2 4 5 6 R3 7 8 9 R4 10 11 12 >>> df.iloc[1] # R2行目を取り出す C1 4 C2 5 C3 6 Name: R2, dtype: int64 >>> df.iloc[[1,2]] # R2, R3行を取り出す C1 C2 C3 R2 4 5 6 R3 7 8 9 >>> df.iloc[1,2] # R2行C3列目の要素を取り出す 6
dropna:欠損値(NaN)の除外
dropnaは欠損値がある行を除外します。
>>> df C1 C2 C3 R1 NaN NaN NaN R2 NaN NaN 6.0 R3 7.0 8.0 9.0 R4 10.0 11.0 12.0 >>> df.dropna() C1 C2 C3 R3 7.0 8.0 9.0 R4 10.0 11.0 12.0
上記の例ではNaNがあるR1, R2が除外されていることがわかります。
欠損値を0で埋める場合は、
## 欠損値を埋める。以下は0で埋める df.fillna(0)
データの書き込み・読み込み
json
jsonの書き込みは以下のコードでできます。
df.to_json(json_path)
jsonの読み込みは以下のコードでできます。
pd.read_path(json_path)
転置 T
転置は単純にdf.Tといった形でできます。
サンプルコードをを以下に示します。
>>> df C1 C2 C3 R1 1 2 3 R2 4 5 6 R3 7 8 9 R4 10 11 12 >>> df.T R1 R2 R3 R4 C1 1 4 7 10 C2 2 5 8 11 C3 3 6 9 12
isnull: NaNかどうかの確認
NaN(欠損値)のときにはTrueを出力します。
>>> df C1 C2 C3 R1 NaN NaN NaN R2 NaN NaN 6.0 R3 7.0 8.0 9.0 R4 10.0 11.0 12.0 >>> df.isnull() C1 C2 C3 R1 True True True R2 True True False R3 False False False R4 False False False
mean:各列の平均を計算
各列の平均を計算する時はmeanメソッドを用います。
>>> df.mean() C1 5.5 C2 6.5 C3 7.5 dtype: float64
pct_change:変化率を計算する
時系列データに対して、1つ前のデータとの変化率を計算する時にはpct_changeメソッドを用います。
>>> values = [1,2,1,4] >>> s = pd.Series(values) >>> s 0 1 1 2 2 1 3 4 dtype: int64 >>> result = s.pct_change() >>> result 0 NaN 1 1.0 2 -0.5 3 3.0 dtype: float64
DataFrameでも同じように使うことができます。
デフォルトは列に対して変化率を求めます。
>>> A = [1,2,1,4] >>> B = [5,1,4,5] >>> df = pd.DataFrame({ ... "A":A, ... "B":B}) ... >>> df A B 0 1 5 1 2 1 2 1 4 3 4 5 >>> result = df.pct_change() >>> result A B 0 NaN NaN 1 1.0 -0.80 2 -0.5 3.00 3 3.0 0.25
axis="columns"と設定することで行に対して
変化率を求めることができます。
>>> result = df.pct_change(axis="columns") >>> result A B 0 NaN 4.00 1 NaN -0.50 2 NaN 3.00 3 NaN 0.25
データの読み込み
csvデータを読み込む時にはread_csvメソッドを用います。
data = pd.read_csv("data.csv") # encodingを指定したい時 data = pd.read_csv("data.csv", encoding="shift-jis")
reindex: indexを変更する
data = pd.read_csv("data.csv") data = data.reindex([...]) data.index = new_index(例 df["new"])
日本語化
matplotlib.rcParams['font.family'] = "IPAGothic"
drop:不要な列や行を削除する
# 行の削除 df.drop(columns=["columns name"])
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.drop.html