pandasとは、pythonにおいてデータ操作を行うことのできるライブラリで、集計やデータ分析で非常によく利用されています。
####目次・検索用
・データフレームの表示設定(set_option)
・データフレームの作成(DataFrame)
・連番の列をつくる(RangeIndex)
・ファイルの読込からデータフレームを作成する(read_csv,read_excel)
・ファイルを書き込む(to_csv,to_excel)
・クリップボードにコピーする(to_clipboard)
・データ型の変更(astype)
・欠損値を特定の値で埋める(fillna)
・欠損値のある行や列を削除する(dropna)
・特定の行を抽出する([ ])
・SQLのように行を抽出する(query)
・列ごとの合計、または行ごとの合計を求める(sum)
・指定した列へ関数の適用(apply)
・他の列でグループ化したデータを操作する(transform)
・データフレームの欠損値のカラムをリスト化(isnull)
・データフレームのカラムのデータ型をリスト化(dtypes)
・データフレーム同士を結合する①(concat)
・データフレーム同士を結合する②(merge)
・ピボットテーブルを作成する(pivot_table)
・整然データ(Tidy Data)に変換する(melt)
###データフレームの表示設定(set_option)
# float型の表示を小数点以下3桁に抑える
pd.set_option('display.float_format', lambda x: '{:.3f}'.format(x))
# defaultでは省略される列でも、この設定をすれば全ての列が表示される
pd.set_option('display.max_columns', None)
###データフレームの作成(DataFrame)
#pandasのimport
import pandas as pd
#データ、インデックス名、列名の定義をする
val=[[11,12,13], [21,22,23], [31,32,33]]
index = ["row1", "row2", "row3"]
columns =["col1", "col2", "col3"]
#インデックスと列名を指定してデータフレームを作成する
df = pd.DataFrame(data=val, index=index, columns=columns)
#とりあえずランダムで良いので、値の入ったデータをさくっと作りたい時
df2 = pd.DataFrame(np.arange(6).reshape(2,3))
上記で最初に作成したデータフレームdfの表はこのようになります。
col1 | col2 | col3 | |
---|---|---|---|
row1 | 11 | 12 | 13 |
row2 | 21 | 22 | 23 |
row3 | 31 | 32 | 33 |
2番目に作ったデータフレームdf2は下記のようになります。
numpyのメソッドを利用することで、任意の行数と列数を持ったデータフレームが簡単に作れます。
0 | 1 | 2 | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
####連番の列をつくる(RangeIndex)
エクセルでは選択とダブルクリックで連番の列を作成できますが、pandasでも簡単にできます。
#1から連番をふる場合
init_val = 1 #このinit_valの値を変更すれば任意の値から連番が作れる
serial_number = pd.RangeIndex(start=init_val, stop=len(df.index) + init_val, step=1)
df["Serial_number"] = serial_number
「Serial_number」列を追加しました。
col1 | col2 | col3 | Serial_number | |
---|---|---|---|---|
row1 | 11 | 12 | 13 | 1 |
row2 | 21 | 22 | 23 | 2 |
row3 | 31 | 32 | 33 | 3 |
###ファイルの読込からデータフレームを作成する(read_csv,read_excel)
通常は1から作成するのではなく、既にあるデータを読み込みことが多いと思います。CSVファイルとExcelファイルの読み込みについて紹介します。
#csvファイル(df.csv)の読込、1行目はheaderとして読まれ、自動的に列名になる
df = pd.read_csv("df.csv")
#csvファイル(df.csv)の読込、header=Noneで列名は自動的に連番になる
df = pd.read_csv("df.csv",header=None)
#Excelファイルを読み込むこともできる
df = pd.read_excel("df.xlsx")
###ファイルを書き込む(to_csv,to_excel)
CSVファイルやExcelファイルで書き込みが出来ます。
#CSVファイル(output.csv)として保存する
df.to_csv("output.csv")
#Excelファイル(output.xlsx)として保存する
df.to_excel("output.xlsx")
####クリップボードにコピーする(to_clipboard)
#データフレームの内容がクリップボードに保存されて、他のエディタなどへ貼り付けが出来る
df.to_clipboard()
###データ型の変更(astype)
# 列.astype(型)でstr型に変更
df["A"] = df["A"].astype(str)
###欠損値を特定の値で埋める(fillna)
# fillna(埋めたい値)で補完する
df = df.fillna(0)
# 列Aに対して、欠損値をその列の平均値で埋める
df["A"] = df["A"].fillna(df["A"].mean())
# 列Aに対して、欠損値を別の列Bの値で埋める
df["A"] = df["A"].fillna(df["B"])
###欠損値のある行や列を削除する(dropna)
#一つでも欠損値がある行を削除する
df = df.dropna()
# 全ての要素が欠損値である行を削除する
df = df.dropna(how = "all")
# 欠損値が一つでもある列を削除する
df = df.dropna(axis = 'columns')
###特定の行を抽出する([ ])
# A列が"a"の行を削除する
#~がついてるので「"a"を満たす行」の補集合になる
df = df[~df["A"]=="a"]
# A列が"a"または"b"の行を削除する
df = df[~df["A"].isin(["a","b"])]
###SQLのように行を抽出する(query)
# A列が1または2の行を抽出する
df = df.query("A in [1,2]")
# A列が0未満かつB列がaaaaである行を抽出する
df.query("A < 0 and B =='aaaa'")
###列ごとの合計、行ごとの合計を求める(sum)
メソッド内のaxisを指定することで列もしくは行どちらの合計を求めるかを指定できます。デフォルトではaxis=0です。
# 列ごとの合計を求める
df.sum()
# 行ごとの合計を求める
df.sum(axis=1)
###指定した列へ関数を適用する(apply)
# 列.apply(関数)で指定した列の全てのデータに関数を適用する
# ここではround関数を適用させる
df["A"] = df["A"].apply(round)
# 列.apply(無名関数)で指定した列の全てのデータに関数を適用する
# ここではsplit関数でA列のデータ全てにカンマ以降の文字列を削除する
df["A"] = df["A"].apply(lambda x: x.split(",")[0])
###他の列でグループ化したデータを操作する(transform)
# 列.transform(関数)で指定した列の全てのデータに関数を適用する
# A列のグループごとに、B列の欠損値をグループ内のAの中央値で埋める
df["B"] = df.groupby("A")["B"].transform(lambda x: x.fillna(x.median()))
###データフレームの欠損値のカラムをリスト化(isnull)
isnullでTrueとFalseが判定され、sumを組み合わせることでTrueの数(欠損値の数)が算出されます。
# nullデータが入っている列名をリストに格納する
null_col = df.columns[df.isnull().sum()>0].tolist()
###データフレームのカラムのデータ型をリスト化(dtypes)
オブジェクト型の列名をリストとして保持していれば、繰り返し処理で一斉にone-hot-encodingなどで数値に変換するのに役立ちます。
# object型の列名をob_colにリストで格納する
ob_col = df.dtypes[df.dtypes=="object"].index.tolist()
###データフレーム同士を結合する①(concat)
データフレーム同士を縦や横にそのままくっつけることができます。
# データフレームdf1とdf2を縦に結合する(SQLでのUNIONの操作)
df = pd.concat([df1,df2]).reset_index(drop=True)
# データフレームdf1とdf2を横に結合する
df = pd.concat([df1,df2],axis=1).reset_index(drop=True)
###データフレーム同士を結合する②(merge)
2つのテーブルデータを任意のキーを指定して結合することができます。
エクセルのVLOOKUP関数のようにデータを紐付ける時にも使えます。
# df1とdf2を列Aをキーとして左外部結合する
df = pd.merge(df1,df2, on="A", how="left")
# df1の列Aとdf2を列Bをキーとして右外部結合する
df = pd.merge(df1,df2, left_on="A", right_on="B",how="right")
#df1とdf2の列Aをキーとして、df2のB列をdf1に結合する(エクセルのVLOOKUP関数)
df_merge = pd.merge(df1,df2, on="A",how="left")["B"]
###ピボットテーブルを作成する(pivot_table)
集計方法は指定しなければ平均値を返すようになっています。
#列Aを行見出し、列Bを列見出しとして、列Cの平均値を算出する
df.pivot_table(index="A", columns= "B", values="C")
#列Aを行見出し、列Bを列見出しとして、列Cと列Dのそれぞれの合計値を算出する
df.pivot_table(index="A", columns= "B", values=["C","D"],aggfunc="sum")
###整然データ(Tidy Data)に変換する(melt)
それぞれの列として持っていたデータを縦持ちに変換することができます。情報は失わずに縦にデータを並べるため、行数は大幅に増えます。
#列Aと列Bを基準にして、それ以外の列で縦持ちに変換して、自分がつけたい項目名(var_name)とその値を持つ列名(value_name)を指定する
df = pd.melt(df,id_vars=["A","B"],var_name="var",value_name="val")