Pandasの使い方ノート
Pandasとは、Pythonのデータ解析ライブラリです。
利用する過程で学んだ内容を再確認できるよう整理しました(内容は入門レベルです)。
下の灰色のボタンで表示を絞り込むことができます。
表型データの抽出・演算
pandas.DataFrame
(data=None, index=None, columns=None, dtype=None, copy=None)
pandasの主要なデータ構造。
2次元でサイズ変更可能な、潜在的に異質な表形式データ。
データ構造にはラベル付きの軸(行と列)も含まれる。
算術演算は行と列のラベルに整列する。
Seriesオブジェクトのディクショナリーのようなものと考えることができる。
戻り値: DataFrame or TextParser(csvファイル: ラベル付き軸を持つ2次元データ構造)
公式のリファレンス(リンク)
公式リファレンスDataFrame.loc(リンク)
情報の取得
操作してもオブジェクト自体は変更しない。
変更したいときは代入する。
import pandas as pd
df = pd.DataFrame(リストなど)
df.info() # データのタイプなど概要表示
df.columns.values # 項目名一覧
df.index.values # インデックス一覧
df["列名"].unique() # 列データの要素をリストアップ
df.head() # 最初の5行
df.tail() # 最後の5行
len(df) # 行数(データの件数)
len(df.columns) # 列数(項目数)
df.corr() # 相関行列
抽出・削除
必要な行・列を抽出
import pandas as pd
df = pd.DataFrame(リストなど)
## 行の抽出
# loc はラベルでインデックス名を参照
df.loc["インデックス名"] # 指定したインデックスの行を抽出
# iloc はインデックス位置で参照
df.iloc[0] # 1行目を抽出
df[:-4] # 最後の4行以外の全て
df[-4:] # 最後の4行
# インデックスが整数の場合、ラベルと位置のどちらを指定しているのかわからないので注意
## 列の抽出
df["列名"] # 1列のデータ(1次元)
df.列名 # df["列名"]と同じ。非推奨(安全性や柔軟性が下がる)
df[["列名1"]] # 1列のデータ(2次元の表)
df[["列名1", "列名2"]] # 複数列のデータ(2次元の表)
df.loc[:,["列名1", "列名2"]] # 列名1から列名2まで抽出
## 行と列の抽出
df.loc[["行名1", "行名2"], ["列名1", "列名2"]] # 行名1から行名2、列名1から列名2を抽出
df.iloc[0].iat[1] # 1行目の2列目の値を抽出
# at, iat は特定の行や列をラベルや位置で参照する
df.at["行名", "列名"]
df.iat[0, 1] # 1行目、2列目の値を抽出
不要な列の削除
## 不要な列の削除
# axis=1は列の削除。axis=0は行の削除
df.drop("列名", axis=1) # 列を削除
df.drop(行番号, axis=0) # 行を削除
# inplace=Trueは呼び出したDataFrameの更新(戻り値なし)・・・処理が軽い
# inplace=Falseは削除したデータを戻り値で返す
df.drop(["列名1", "列名2"], axis=1, inplace=True)
条件に合う行を抽出
## 条件に合う行を抽出
df[df["列名"] <= 変数]
df[(df["列名"] >= 変数) & (df["列名"] <= 変数) ]
# and条件は&で、or条件は|でつなぐ
# 文字列を数字に変換するときは df["列名"].astype('int')
# 部分一致を抽出
df[df.str.contains("文字列")]
# query関数を利用すればデータフレーム名を何度も書く必要がない
df.query('"2024-08-01" <= 列名 <= "2024-08-31"')
## ランキングを計算して並べ替え
df["rank"] = df["列名"].rank(method='min', ascending=False)
# method='min' は重複は同じ順位。'first'なら上の行が先の順
# ascendin=False は値が大きい順に順位をつける
## 上位5位を抽出
df.sort_values(by=['rank'])[0:5]
グループ化と計算
グループ化してまとめて関数処理
import pandas as pd
df = pd.DataFrame(リストなど)
## グループ化してまとめて関数処理
# agg関数(引数に辞書)は、キーに列名、valueに関数を指定して処理をまとめられる
result = df.groupby('列名1').agg({'列名2': 'count', '列名2': 'nunique'})
# 列番号を振り直す
# inplace=Trueは呼び出したDataFrameの更新(戻り値なし)・・・処理が軽い
result.reset_index(inplace=True)
result.columns = ['列名1', '新しい列名1', '新しい列名2']
グループ化して合計や代表値を計算
## 列1と列2の組み合わせでグループ化し、列3の合計を計算する
result = df.groupby(['列名1', '列名2'])['列名3'].sum().reset_index()
# 列名を変更する。変更が少ないときはrename推奨
result.rename(columns=('列名3': '新しい列名'), inplace=True)
## 列1でグループ化して列2の代表値を計算
# ラムダ式を使う。lambda x:の後にxを処理する関数を書く
result = df.groupby('列名1').agg({'列名2': ['max', 'min', 'mean', 'median', lambda x: np.percentile(x, q=20), 'var', 'std']}).reset_index()
result.columns = ['列名1', '最大', '最小', '平均', '中央値', '20パーセンタイル値', '分散', '標準偏差']
# fillna関数で、分散と標準偏差に不正な値があれば0に変換する
result.fillna(values = {'分散': 0, '標準偏差': 0}, inplace=True)
グループ化して日付順に番号を付ける
## グループ化して日付順に番号を付ける
# 文字列からtimestamp型に変換
df['日付データ列'] = pd.to_datetime(df['日付データ列'], format='%Y-%m-%d')
# rank関数で順位付け
# ascending=Trueは昇順
# method引数で同じ値のデータの順位の決め方を指定
df['新しい列名'] = df.groupby('列名1')['日付データ列'].rank(ascending=True, method='first')
ピボットテーブルで小計を計算
## ピボットテーブルで小計を計算
# pivot_table関数で横持ち変換と集約処理を同時に実行
# pivot_tableの引数1は集計の対象データ。index引数は集合のキー値(縦)、columns引数はデータの要素のキー値(横)
# values引数はデータの要素の値となる列を指定
# aggfuncの引数にvalues引数で指定した列値をデータ要素の値に変換する関数を指定
# fill_valueで該当する列の値がない場合のデータ要素の値を指定
pd.pivot_table(df, index='列名1', columns='列名2', values='列名3', aggfunc=lambda x: len(x), fill_value=0)
編集
並び替え
import pandas as pd
df = pd.DataFrame(リストなど)
## 操作
# 並び変え
df.T # 行列の入れ替え
df.sort_index() # インデックスでソート
df.sort_values(by="列名", ascending=False) # 大きい順にソート(デフォルトは小さい順)
データのリスト化
# DataFrameをPythonで使うリストに変換する
df.values # [["列1", 各データ], ["列2", 各データ], ・・]
データの結合
## データの結合
df1 = pd.DataFrame(リスト1)
df2 = pd.DataFrame(リスト2)
# 結合する前にデータを抽出して軽くする
# 列名2は値がtrueの時に抽出する
# merge関数で引数1番目と2番目のテーブルを結合する
# how='inner'は結合する処理の種類
pd.merge(df1.query('列名1 == 1'), df2.query('列名2'), on='共通する列名(キー)', how='inner')
# 複数の結合キーを設定するときはon=['キー1', 'キー2']
データの対数化
## データの対数化(値が大きくなるほど値の差の影響が小さくなる時に有効)
# 1以上の値を対数化する方が扱いやすいので1を足す
# logの引数1は対数化する値。引数2は対数の底
# apply関数でpandas.Seriesオブジェクトのすべての値に関数を適用できる
# 引数をそのまま渡す場合は関数を指定し、そうでないときはラムダ式で指定する
df['新しい列名'] = df['列名'].apply(lambda x: np.log(x + 1, 10))
データのカテゴリ化
## データのカテゴリ化(0〜9、10〜19、11〜19の値毎にグループ分けする)
# floor関数で小数点以下を切り捨てる(3.8は3に、-3.4は-4になる)
# astype関数はデータ型を変換する。例はPandasのCategory型に変換
df['新しい列名'] = (np.floor(df['列名'] / 10) * 10).astype('category')
データの正規化
## データの正規化(平均0、分散1に変換)
# StandardScalerクラスは平均0、分散1の正規化を行うオブジェクトを生成する
from sklearn.preprocessing import StandardScaler
# float型に変換(小数点以下を扱えるようにする)
df['列1'] = df['列1'].astype(float)
# 正規化を行うオブジェクトを生成
ss = StandardScaler()
# fit_transform関数はfit関数(正規化の前準備)とtransform関数(変換処理)を両方行う
result = ss.fit_transform(df[['列1', '列2']])
df['新しい列名1'] = [x[0] for x in result]
df['新しい列名2'] = [x[1] for x in result]
# 最小0、最大1に変換する正規化はMinMaxScalerクラスを使う
ダミー変数化
## ダミー変数化
# 事前にカテゴリ型に変換
df['列名1'] = pd.Categorical(df['列名1'])
# get_dummies関数でダミー変数化
# drop_first=Falseでカテゴリ値のダミーフラグを生成
# drop_first=Trueで最初のダミーフラグを落としてフラグ数を1つ減らす・・・非推奨
dummy_vars = pd.get_dummies(df['列名1'], drop_first=False)
外れ値の除去
## 外れ値の除去
# 平均値から標準偏差の3倍以上のデータを除去
# reset_index関数を呼び出して行番号を更新する
df = df[(abs(df['列名1'] - np.mean(df['列名1'])) / np.std(df['列名1']) < 3)].reset_index()
日時データ
各日時要素の取り出し
## 各日時要素の取り出し
df['日時列'] = pd.to_datetime(df['日時列'], format='%Y-%m-%d %H:%M:%S')
# 年を取得
df['日時列'].dt.year
# 曜日を取得(0が日曜日、1が月曜日)
df['日時列'].dt.dayofweek
# 時刻を取得
df['日時列'].dt.hour
日時差の計算
## 日時差
df['日時列'] = pd.to_datetime(df['日時列'], format='%Y-%m-%d %H:%M:%S')
df['日時列2'] = pd.to_datetime(df['日時列'], format='%Y-%m-%d %H:%M:%S')
# 日単位の差分(小数点以下切り上げ)
(df['日時列'] - df['日時列2']).astype('timedelta64[D]')
# 時単位の差分(小数点以下切り上げ)
(df['日時列'] - df['日時列2']).astype('timedelta64[h]')
# 1日加える
df['日時列'] + datetime.timedelta(days=1)
# 1時間加える
df['日時列'] + datetime.timedelta(hours=1)
データ入出力関数
read_csv / to_csv # テキストの入力 / 出力
read_table, read_fwf # テキスト入力
read_json / to_json
read_html / to_html
read_excel / to_excel
read_hdf / to_hdf # HDF5の入出力
read_sql / to_sql
read_stata / to_stata
read_clipboard / to_clipboard
read_pickle / to_pickle
各パラメータ
data(ndarray (structured or homogeneous), Iterable, dict, or DataFrame)
Dictには、Series、配列、定数、dataclass、リストライクオブジェクトを含めることができる。
dataがdictの場合、列の順序は挿入順序に従う。
dictがインデックスを定義したSeriesを含む場合、そのインデックスで整列される。
index(Index or array-like)
結果のフレームに使用するインデックス。
入力データにインデックス情報がない場合、デフォルトはRangeIndex。
columns(Index or array-like)
列ラベルがない場合に結果のフレームに使用する列ラベル。
デフォルトはRangeIndex(0, 1, 2, ..., n)。
データに列ラベルが含まれる場合、代わりに列選択を行う。
dtype(dtype, default None)
強制するデータ型。
単一のデータ型のみが許可される。
None の場合は推測する。
copy(bool or None, default None)
入力からデータをコピーする。
dictデータの場合、デフォルトのNoneはcopy=Trueと同じように動作する。
DataFrameまたは2次元ndarray入力の場合、デフォルトのNoneはcopy=Falseと同じように動作する。
dataが1つ以上のSeriesを含むdictの場合、copy=Falseはこれらの入力がコピーされないようにする。
欠損値の削除
pandas.DataFrame.drop
(labels=None, *, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
使用例
import pandas as pd
df = pandas.DataFrame(データ)
# 欠損値の有無を確認
df.isnull().any(axis=0) # 欠損値が1つでもあればTrue
# 欠損値の数
df.isnull().sum()
## 行単位(横)の削除
df.drop(['index名1', 'index名2'])
## 列単位(縦)の削除
df.drop(['列名1', '列名2'], axis=1)
df.drop(columns=['列名1', '列名2'])
labels(single label or list-like)
ドロップするインデックスまたは列ラベル。
タプルは1つのラベルとして使用され、リストのように扱われることはない。
axis(0 or 'index', 1 or 'columns')
0 or 'index' : 行を削除する。
1 or 'columns' : 列を削除する。
inplace(bool)
False : コピーを返す。
それ以外 : Datafremeを変更してNoneを返す。
pandas.DataFrame.dropna
(*, axis=0, how='any', thresh=no_default, subset=None, inplace=False, ignore_index=False)
使用例
df = pandas.DataFrame(データ)
# 欠損値の有無を確認
df.isnull().any(axis=0) # 欠損値が1つでもあればTrue
## 行単位(横)での処理
df.dropna() # 欠損値を含む行を削除
df.dropna(how='all') # すべての要素が欠損している行を削除
df.dropna(thresh=2) # 2つ以上欠損値のある行を削除
df.dropna(subset=['列名1', '列名2']) # 列1, 列2で欠損値があれば削除
## 列単位(縦)での処理
df.dropna(axis='列名') # 欠損値を含む列を削除
df.dropna(subset=['列名1', '列名2']) # 欠損値がある場合に削除する列を指定
## 欠損データの削除
# replace関数で引数1を引数2に置き換える(dropnaはNoneを欠測値として認識しない)
df.replace('None', np.nan, inplace=True)
# dropna関数でnanを含むレコードを削除
# subsetを指定しない場合はすべての列が対象となる
# inplace=TrueでDataFrameを更新
df.dropna(subset=['列名1'], inplace=True)
axis(0 or 'index', 1 or 'columns')
0 or 'index' : 欠損値を含む行を削除する。
1 or 'columns' : 欠損値を含むカラムを削除する。
how('any', 'all')
'any' : NA値が1つでもあれば、その行または列を削除する。
'all' : 全ての値がNAの場合、その行または列を削除する。
thresh(int)
非NA値を要求する数。howと組み合わせることはできない。
subset(column label or sequence of labels)
列名を指定した場合 : 指定した列にNA値があれば削除する。
inplace(bool)
False : コピーを返す。
それ以外 : Datafremeを変更してNoneを返す。
欠損値の補完
欠損値の置換
import pandas as pd
df = pandas.DataFrame(データ)
# 欠損値の置換
df.fillna(method = 'ffill') # 前列のデータをコピー
df.fillna(method = 'bfill') # 後列のデータをコピー
空白や文字列の置換
# 空白の置換
df["列名"].str.replace(" ", "")
# 文字列の変換
df["列名"] = df["列名"].str.replace("///", "")
# 数値データのカンマを削除
df["列名"] = pd.to_numeric(df["列名".str.replace(",", ""))
穴埋め
# 欠損値の置換
df['列名1'].fillna(1) # 列名1の欠損値を1で穴埋め
df['列名1'].fillna(df['列名1'].mean()) # 列名1の欠損値を列名1の平均値で穴埋め
df['列名1'].fillna(df['列名1'].median()) # 列名1の欠損値を中央値で穴埋め
df['列名1'].fillna(df['列名1'].mode()) # 列名1の欠損値を最頻値で穴埋め
df['列名1'].ffill(df['列名1']) # 1つ前の値で埋める
平均値で補完
## 欠損データを平均値で補完
df.replace('None', np.nan, inplace=True)
# 数値型に変換
df['列名1'] = df['列名1'].astype('float64')
# 欠損値を平均値で補完
df['列名1'].fillna(df['列名1'].mean(), inplace=True)
PMM(Predictive Mean Matching)による多重代入
## PMM(Predictive Mean Matching)による多重代入
from fancyimpute import MICE
# replace関数で引数1を引数2に置き換える(dropnaはNoneを欠測値として認識しない)
df.replace('None', np.nan, inplace=True)
# mice関数を利用するためにデータ型を変換
df['列名1'] = df['列名1'].astype('float64')
df['列名2'] = df['列名2'].astype('category')
df['列名3'] = df['列名3'].astype('category')
# ダミー変数化
dummy_flg = pd.get_dummies(df[['列名2', '列名3']], drop_first=True)
# mice関数にPMMを指定して多重代入法を実施
# n_imputationsは取得するデータセットの数
# n_burn_inは値を取得する前に試行する回数
mice = MICE(n_imputations=10, n_burn_in=50, impute_type='pmm')
# 処理内部でTensorFlowを利用
production_mice = mice.multiple_imputations(pd.concat([df[['列名4', '列名1']], dummy_flg], axis=1)
# 補完する値
production_mice[0]
KNN(k-nearest neighbor algorithm)による補完
## KNN(k-nearest neighbor algorithm)による補完
from sklearn.neighbors import KNeighborsClassifier
# replace関数でNoneをnanに変換
df.replace('None', np.nan, inplace=True)
# 欠損していないデータの抽出
train = df.dropna(subset=['列名1'], inplace=False)
# DataFrame.index.difference関数は引数のindex(行番号)と異なるindexを返す関数
# (呼び出し元のindexにしかないindexを取得する)
# 欠損しているデータの抽出
test = df.loc[df.index.difference(train.index), :]
# knnモデル生成、n_neighborsはknnのkパラメータ
# KNeighborsClassifierクラスはKNNモデルを学習し、予測値を返すオブジェクトを生成する
kn = KNeighborsClassifier(n_neighbors=3)
# knnモデル学習
# 引数1にデータ間の距離算出に利用する学習データ、引数2に正解データを指定する
kn.fit(train[['列名2', '列名3']], train['列名1'])
# knnモデルで予測値を計算し、列1を補完
# predict関数の引数はデータ間の距離の算出に利用するデータ
test['列1'] = kn.predict(test[['列2', '列3']])
重複データの処理
pandas.DataFrame.drop_duplicates
(subset=None, *, keep='first', inplace=False, ignore_index=False)
使用例
df = pandas.DataFrame(データ)
df.duplicated().value_counts() # 重複データの数
df.drop_duplicates() # 一行全て重複したデータの削除(2つ目以降を削除)
df.drop_duplicates(subset=['列名']) # 指定した列に重複があれば行ごと削除(最初のデータのみ残す)
df.drop_duplicates(subset=['列名'], keep='last') # 最後のデータのみ残す
csv入出力
read_csv, to_csv
公式のリファレンス(リンク)
戻り値: DataFrame or TextParser(csvファイル: ラベル付き軸を持つ2次元データ構造)
使用例
import pandas as pd
## CSVファイルの読み込み
# 文字コードを指定し、2行目をヘッダー行に指定し、0列目をインデックスに指定する
# parse_dates=[0] で日時の型として読み込む
df = pd.read_csv("ファイル名.csv", encoding='shift-jis', header=2, index_col=0, parse_dates=[0])
# インデックスを列ラベルで指定
df = pd.read_csv("ファイル名.csv", index_col='列名')
## データの確認
df.head() # 先頭5行
df["日付列"].min() # 日付の最初
df["日付列"].max() # 日付の最後
df.isnull().sum() # 欠損値の数
df.describe() # 統計値の一覧表示
## データの型変更
df["日付列"] = pd.to_datetime(df["日付列"]) # datetime型に変更
# 月別集計
df["月別"] = df["日付列"].dt.strftime("%Y%m") # 年月列の作成
df.groupby("月別").sum()["集計する列"]
## csv出力
df.to_csv("ファイル名.csv", encoding='shift-jis')
df.to_csv("ファイル名.csv", index=False, header=False) # インデックスとヘッダーを削除
各パラメータ
filepath_or_buffer(str, path object or file-like object)
有効な文字列のパスであれば何でもいい。文字列はURLでもいい。
http、ftp、s3、gs、file(ファイルURLの場合、ホストが必要)。
ローカルファイルの場合はfile://localhost/path/to/table.csv
パスオブジェクトを渡したい場合は任意のos.PathLikeを受け付ける。
file-like objectとはファイルハンドルやStringIOのようなread()メソッドを持つオブジェクト。
sep(str, default ',')
データを分割する時に使う文字列または正規表現。
1文字以上かつ'\s+'と異なるセパレータは正規表現として解釈され、Pythonの解析エンジンを使用する。
正規表現の場合はC言語版の処理ライブりが使えなくなる。
正規表現の区切り文字は引用符で囲まれたデータを無視しやすいので注意。
正規表現の例: '\r\t'
delimiter(str, default None)
sepの別名。
header(int, list of int, None, default 'infer')
列名として使用する行番号とデータの開始位置(最初の行番号は0)。
ヘッダ行がない場合はNoneを指定する。
namesを指定した場合、header=Noneと同じ。
namesを指定しない場合、header=0と同じ。列名はファイルの最初の行から推測される。
既存の名前を置き換えられるように、明示的にheader=0を渡す。
ヘッダは[0,1,3] のように、列の複数インデックスの行位置を指定する整数のリストとすることができる。
指定されていない行はスキップされる (この例では2がスキップされる)。
skip_blank_lines=Trueの場合、コメント行や空行を無視する。
header=0はファイルの先頭行ではなくデータの先頭行を示すことに注意する。
names(array-like, optional)
戻り値のデータフレームで使用する列名のリスト。
データ読み込み時に任意の列名を指定したいときに使う。
headerの指定があってもこの指定で上書きされる。
ファイルにヘッダ行が含まれている場合は、明示的にheader=0を渡して列名を上書きする必要がある。
このリストには重複は許されない。
index_col(int, str, sequence of int / str, or False, optional, default None)
戻り値のデータフレームで行のインデックスとして使われる列の番号か名前。
int / strのシーケンスが与えられた場合、MultiIndexが使用される。
注意: index_col=Falseを使用すると、各行の末尾に区切り文字があるような不正なファイルの場合、
最初の列をインデックスとして使用しないようにできる。
usecols(list-like or callable, optional)
リストとして指定した列(列番号もしくは列名を指定)のデータだけを読み込む。
リスト形式の場合、すべての要素は以下のどれかである必要がある。
位置指定(ドキュメントの列への整数インデックス)
nameでユーザが指定した列名
ドキュメントヘッダ行(複数可)から推測される列名に対応する文字列
名前が与えられている場合、文書ヘッダ行は考慮されない。
リストのようなusecolsパラメータは[0, 1, 2]あるいは['foo', 'bar', 'baz']のようになる。
要素の順番は無視されるので、usecols=[0, 1]は[1, 0]と同じになる。
要素順を保持したデータからDataFrameを生成するには、['foo', 'bar'] 順の列に対しては
pd.read_csv(data, usecols=['foo', 'bar'])['foo', 'bar']
['bar', 'foo'] 順に対してはpd.read_csv(data, usecols=['foo', 'bar'])['bar', 'hoge"] とする。
callableの場合、callable関数は列名に対して評価され、callable関数がTrueと評価される列名を返す。
callableの有効な引数の例としては、lambda x: x.upper() in ['AAA', 'BBB', 'DDD']がある。
このパラメータを使用すると解析時間が大幅に短縮され、メモリ使用量も少なくなる。
squeeze(bool, default False)
読み込まれたデータに1つの列しか含まれていない場合、Seriesを戻り値とする。
(パースされたデータが1つの列しか含まない場合、Seriesを返す)
prefix(str, optional)
ヘッダがない場合に列番号に付加するプレフィックス。
例えば X0, X1, ... には 'X' を付加する。
mangle_dupe_cols(bool, default True)
重複する列は 'X'...'X' ではなく 'X', 'X.1', ...'X.N' として指定される。
Falseを渡すと、列に重複した名前がある場合データが上書きされる。
dtype(Type name or dict of column -> type, optional)
特定の列のデータ型を指定する。
例: {'a': np.float64, 'b': np.int32, 'c': 'Int64'}。
d型を保持し解釈しないようにするために、適切なna_values設定とともにstrまたはobjectを使用する。
コンバータが指定された場合、それらはdtypeの変換の代わりに適用される。
engine({'c', 'python', 'pyarrow'}, optional)
使用するパーサエンジン。
Cとpyarrowエンジンは高速で、pythonエンジンは低速だが機能が充実している。
マルチスレッドは現在pyarrowエンジンのみでサポートされている。
converters(dict, optional)
列名とその列の全データに適用する関数を指定する。
キーは整数値か列のラベル。
{"列1": f}を指定した場合、列1のすべての値に対して関数fを適用する。
true_values(list, optional)
Trueとみなす値。
false_values(list, optional)
Falseとみなす値。
skipinitialspace(bool, default False)
Trueの場合、デリミタ直後の空白を無視する。
skiprows(list-like, int or callable, optional)
読み飛ばす行数(int)もしくは読み飛ばす行番号のリスト(最初は0)を指定する。
callableの場合、callable関数は行のインデックスに対して評価され、
行をスキップする必要がある場合はTrueを、そうでない場合はFalseを返す。
callableの有効な引数の例としては、lambda x: x in [0, 2]がある。
skipfooter(int, default 0)
無視するファイル末尾の行数(engine='c'では未対応)。
nrows(int, optional)
最初の何行を読み込むか指定する。
ヘッダは数に入れない。
大きなファイルの一部分を読み込む時に使う。
na_values(scalar, str, list-like, or dict, optional)
欠損値と認識する文字列の指定。デフォルト以外を指定する場合に使う。
dictが渡された場合、列ごとの特定のNA値。
デフォルトでは、以下の値はNaNとして解釈される。
'', '#N/A', '#N/A N/A', '#NA', '-1.#IND', '-1.#QNAN', '-NaN', '-nan', '1.#IND', '1.#QNAN',
'<NA>', 'N/A', 'NA', 'NULL', 'NaN', 'n/a', 'nan', 'null'.
keep_default_na(bool, default True)
デフォルトの欠損値リストを使うかどうか。
na_valuesが渡されるか否かによって、以下のような動作となる。
keep_default_naがTrueでna_valuesが指定された場合、解析に使用されるデフォルトのNaN値にna_valuesが追加される。
keep_default_naがTrueでna_valuesが指定されない場合、解析にはデフォルトのNaN値のみが使用される。
keep_default_naがTrueでna_valuesが指定された場合、解析にはデフォルトの NaN値が使用される。
keep_default_naがFalseでna_valuesが指定された場合、na_valuesに指定されたNaN値のみが解析に使用される。
keep_default_naがFalseでna_valuesが指定されない場合、NaNとして解析される文字列はない。
na_filterにFalseを指定した場合、keep_default_naとna_valuesは無視される。
na_filter(bool, default True)
欠損値マーカー(空文字列とna_valuesの値)を検出する。
NAがないデータでは、na_filter=Falseを渡すと大きなファイルを読み込む際のパフォーマンスが向上することがある。
verbose(bool, default False)
パースに関する情報を表示する。
ファイル変換の各ステージにかかった時間やメモリ使用量など。
skip_blank_lines(bool, default True)
Trueの場合、NaN値として解釈するのではなく空白行をスキップする。
parse_dates(bool or list of int or names or list of lists or dict, default False)
Trueの場合、全列のデータをdatetimeとして読み込む。
[1, 2, 3]を指定した場合、1, 2, 3列をそれぞれ別の日付列として読み込む。
リストのリストの場合、1列と3列を組み合わせて、1つの日付列として読み込む。
ディクショナリ、例: {'foo' : [1, 3]}の場合、列1, 3を日付として読み込み、結果を'foo'と呼ぶ。
読み込めない値やタイムゾーンが混在しているなどの理由で列やインデックスを日付時刻の配列として表現できない場合、
その列やインデックスはオブジェクトデータ型としてそのまま返される。
非標準の日時の読み込みには、pd.read_csvの後にpd.to_datetimeを使用すること。
タイムゾーンが混在するインデックスや列を解析するには、
date_parserをutc=Trueで部分的に適用されたpandas.to_datetime()として指定する。
注意: iso8601フォーマットの日付には、高速なパスが存在する。
infer_datetime_format(bool, default False)
Trueでparse_datesが有効な場合、
pandasは列内のdatetime文字列のフォーマットを推測しようとし、推測可能な場合はより高速なパース方法に移行する。
これによってパース速度が5-10倍向上することもある。
keep_date_col(bool, default False)
複数の列を結合して日付として読み取る場合、結合に用いられた列を残す。
date_parser(function, optional)
日付を読み取る際に使う関数を指定する。
デフォルトではdateutil.parser.parserを使用して変換を行う。
date_parserを3つの異なる方法で呼び出そうとし、例外が発生した場合は次へ進む。
(parse_datesで定義された)一つ以上の配列を引数として渡す。
(parse_datesで定義された列の)文字列値を一つの配列に連結して渡す。
(parse_datesで定義された列に対応する)一つ以上の文字列を引数とした各行に対してdate_parserを一度呼ぶ。
dayfirst(bool, default False)
複数の解釈ができる日付を読み取る際、ヨーロッパで標準的なDD/MM/YYYY形式として扱う。
cache_dates(bool, default True)
Trueの場合、一意に変換された日付のキャッシュを使用して、datetimeの変換を適用する。
重複する日付文字列、特にタイムゾーンがずれているものを解析する際に、大幅なスピードアップの可能性がある。
iterator(bool, default False)
ファイルを部分的に読み込むためのTextFileReaderオブジェクトを戻り値とする。
chunksize(int, optional)
イテレーションに使うファイル内のブロックのサイズ。
compression(str or dict, default 'infer')
ディスク上のデータをオンザフライで伸長する。
'infer'で'filepath_or_buffer'がpath-likeならば、以下の拡張子から圧縮を検出する。
.gz', '.bz2', '.zip', '.xz', '.zst', '.tar', '.tar.gz', '.tar.xz', '.tar.bz2'(その他の場合は圧縮しない)。
zip'または'tar'を使う場合、ZIPファイルは読み込むべきデータファイルを1つだけ含んでいなければならない。
Noneに設定すると解凍されない。
キー'method'に{'zip', 'gzip', 'bz2', 'zstd', 'tar'}のいずれかを設定したdictも可能で、
他のキーと値のペアはそれぞれ zipfile.ZipFile, gzip.GzipFile, bz2.BZ2File,
zstandard.ZstdDecompressor, または tarfile.TarFile へ転送される。
例として、カスタム圧縮辞書を使ったZstandard伸長のために次のように渡すことができる。
compression={'method': 'zstd', 'dict_data': my_compression_dict}
thousands(str, optional)
3桁区切りのセパレータ。
例えば ","
decimal(str, default '.')
小数点として認識する文字。
例えば "."
(ヨーロッパのデータには "," を使用する)。
lineterminator(str (length 1), optional)
ファイルを行単位に分割するための文字。
Cパーサーでのみ有効。
quotechar(str (length 1), optional)
引用符で囲まれた項目の開始と終了を示すために使用される文字。
引用符で囲まれた項目にはデリミタが含まれるが、それは無視される。
quoting(int or csv.QUOTE_* instance, default 0)
csv.QUOTE_*定数でフィールド引用の動作を制御する。
以下のどれかを使用する。
QUOTE_MINIMAL(0)、QUOTE_ALL(1)、QUOTE_NONNUMERIC(2)、QUOTE_NONE(3)
doublequote(bool, default True)
quotecharが指定され、かつ引用がQUOTE_NONEでないとき、
フィールドの内側にある連続した2つのquotechar要素を1つのquotechar要素として解釈するか指定する。
escapechar(str (length 1), optional)
他の文字をエスケープするために使用される1文字の文字列。
comment(str, optional)
指定した文字または文字列以降を各行からコメントとして切り離す。
行頭で見つかった場合、その行は完全に無視される。
このパラメータは1文字でなければならない。
空行と同様に、完全にコメントされた行はパラメータヘッダによって無視されるが、skiprowsによって無視されるわけではない。
(skip_blank_lines=Trueである限り)
comment='#'の場合、header=0で#empty\na,b,c\n1,2,3をパースすると、'a,b,c'がヘッダーとして扱われることになる。
encoding(str, optional)
読み書きの際に使用する文字コードを指定する。
例: 'utf-8' 'shift-jis'。
encoding_errors(str, optional, default “strict”)
エンコードエラーをどのように扱うか。
dialect(str or csv.Dialect, optional)
文字列かcsv.Dialectインスタンスによりファイルフォーマットを詳細に指定する。
以下の各パラメータの値を上書きする。
delimiter, doublequote, escapechar, skipinitialspace, quotechar, quoting
値を上書きする必要がある場合は、ParserWarningが発行される。
error_bad_lines(bool, optional, default None)
フィールドが多すぎる行(カンマが多すぎるcsv行)はデフォルトで例外が発生しDataFrameは返されない。
Falseの場合、これらの「悪い行」は返されるDataFrameから削除される。
warn_bad_lines(bool, optional, default None)
error_bad_linesがFalseでwarn_bad_linesがTrue の場合、「悪い行」に対する警告が出力される。
on_bad_lines({'error', 'warn', 'skip'} or callable, default 'error')
不正な行(フィールドが多すぎる行)に遭遇したときの対処法を指定する。
許可される値は次のとおり。
'error', 不正な行に遭遇した場合にExceptionを発生させる。
'warn', 不正な行があった場合に警告を発生させ、その行をスキップさせる。
'skip', 不良行があった場合に警告を発生させず、その行をスキップする。
delim_whitespace(bool, default False)
sep='\s+' と設定するのと同じ。
このオプションをTrueに設定すると、delimiterパラメータに何も渡さないようにする。
low_memory(bool, default True)
内部的にファイルをチャンク単位で処理するためパース時のメモリ使用量は少なくなるが、型の推論が混在する可能性がある。
型が混在しないようにするためにはFalseを設定するか、dtypeパラメータで型を指定する。
ファイル全体が1つのDataFrameに読み込まれることに注意。
チャンクでデータを返すにはchunksizeまたはiteratorパラメータを使用する(Cパーサーでのみ有効)。
csv入出力
read_csv, to_csv
公式のリファレンス(リンク)
戻り値: DataFrame or TextParser(csvファイル: ラベル付き軸を持つ2次元データ構造)
使用例
import pandas as pd
## CSVファイルの読み込み
# 文字コードを指定し、2行目をヘッダー行に指定し、0列目をインデックスに指定する
# parse_dates=[0] で日時の型として読み込む
df = pd.read_csv("ファイル名.csv", encoding='shift-jis', header=2, index_col=0, parse_dates=[0])
# インデックスを列ラベルで指定
df = pd.read_csv("ファイル名.csv", index_col='列名')
## データの確認
df.head() # 先頭5行
df["日付列"].min() # 日付の最初
df["日付列"].max() # 日付の最後
df.isnull().sum() # 欠損値の数
df.describe() # 統計値の一覧表示
## データの型変更
df["日付列"] = pd.to_datetime(df["日付列"]) # datetime型に変更
# 月別集計
df["月別"] = df["日付列"].dt.strftime("%Y%m") # 年月列の作成
df.groupby("月別").sum()["集計する列"]
## csv出力
df.to_csv("ファイル名.csv", encoding='shift-jis')
df.to_csv("ファイル名.csv", index=False, header=False) # インデックスとヘッダーを削除
memory_map(bool, default False)
filepath_or_bufferにファイルパスが指定された場合、
ファイルオブジェクトを直接メモリ上にマップし、そこから直接データにアクセスする。
このオプションを使用すると、I/Oオーバーヘッドがなくなるため、パフォーマンスが向上する。
float_precision(str, optional)
Cエンジンが浮動小数点値に対してどのコンバータを使用するかを指定する。
オプションは、通常のコンバータはNoneまたは'high'、
オリジナルの低精度pandasコンバータは'legacy'、
ラウンドトリップコンバータは'round_trip'。
storage_options(dict, optional)
特定のストレージ接続に意味のある追加オプション。
例えばホスト、ポート、ユーザ名、パスワード、など。
HTTP(S) URLの場合、キーと値のペアはヘッダーオプションとしてurllib.request.Requestに転送される。
その他のURL(例えば"s3://"や"gcs://"で始まるURL)については、Key-Valueペアはfsspec.openに転送される。
Excel出力
使用例
import pandas as pd
import openpyxl
df.to_excel("ファイル名.xlsx", index=False, sheet_name="シート名") # インデックスを削除。シート名を指定
# 複数のシートを出力
with pd.ExcelWriter("ファイル名.xlsx") as writer:
df1.to_excel(writer, sheet_name="シート1")
df2.to_excel(writer, sheet_name="シート2")
データベース入力
read_sql
SQLクエリまたはデータベースのテーブルをDataFrameに読み込む。
read_sql_tableとread_sql_queryのラッパーです (後方互換性)。
与えられた入力に応じて特定の関数に委譲される。
SQLクエリはread_sql_queryに渡され、データベースのテーブル名はread_sql_tableに渡される。
委譲された関数は、より具体的な注意事項を持っているかもしれないことに注意。
公式のリファレンス(リンク)
戻り値: DataFrame or Iterator[DataFrame]
使用例
from sqlite3 import connect
conn = connect(':memory:')
df = pd.DataFrame(data=[[0, '10/11/12'], [1, '12/11/10']],
columns=['int_column', 'date_column'])
pd.read_sql('SELECT int_column, date_column FROM test_data',
conn, parse_dates=["date_column"])
各パラメータ
sql (str or SQLAlchemy Selectable (select or text object))
実行されるSQLクエリ、またはテーブル名。
con (SQLAlchemy connectable, str, or sqlite3 connection)
SQLAlchemy を使うと、そのライブラリがサポートしているどのDBでも使うことができる。
DBAPI2オブジェクトの場合、sqlite3のみサポートする。
SQLAlchemyの接続可能なエンジンの廃棄とコネクションのクローズ はユーザの責任。
strコネクションは自動的にクローズされる。
index_col (str or list of str, optional, default: None)
行名(MultiIndex)として使う列の番号もしくは列名を指定する。
coerce_float (bool, default True)
SQLの結果セットに有用な文字列でも数値でもない値を浮動小数点に変換する。
(decimal.Decimalなど)
params (list, tuple or dict, optional, default: None)
executeメソッドに渡すパラメータのリスト。
パラメータを渡すのに使用する構文は、データベースドライバに依存する。
例えばpsycopg2では、%(name)sを使用するので、params={'name' : 'value'}を使用する。
parse_dates (list or dict, default: None)
日付としてパースする列名のリスト。
Dict of {column_name: format string}
format stringは文字列の時間をパースする場合はstrftime互換。
整数のタイムスタンプをパースする場合は (D, s, ns, ms, us) のどれか。
Dict of {column_name: arg dict}
arg dictはpandas.to_datetime()のキーワード引数に対応。
特にSQLite のようなネイティブなDatetimeサポートがないデータベースで有用。
columns (list, default: None)
SQLテーブルから選択する列名のリスト(テーブルを読み込むときのみ使用)。
chunksize (int, default None)
指定された場合、chunksizeは各チャンクに含まれる行の数であるイテレータを返す。
データベース出力
to_sql
DataFrameに格納されたレコードをSQLデータベースに書き込む。
SQLAlchemyがサポートするデータベースをサポートする。
テーブルの新規作成、追加、上書きが可能。
公式のリファレンス(リンク)
戻り値: None or int(to_sqlによって影響を受ける行の数)
メソッドに渡されたcallableが整数の行数を返さなかった場合はNone
使用例
import pandas as pd
from sqlalchemy import create_engine
## データフレームからsqliteに出力する場合
engine = create_engine('sqlite://', echo=False)
df = pd.DataFrame({'name' : ['User 1', 'User 2', 'User 3']})
df.to_sql('users', con=engine)
## CSVからpostgresqlに出力する場合
# CSVファイルを読み込む
df = pd.read_csv('sample.csv')
# PostgreSQLの接続情報
# 実際に使う場合はコードに書かず環境変数や設定ファイルを使う
db_username = 'username'
db_password = 'password'
db_host = 'localhost'
db_port = '5432'
db_name = 'database_name'
# SQLAlchemy engineの作成
engine = create_engine(f'postgresql://{db_username}:{db_password}@{db_host}:{db_port}/{db_name}')
# DataFrameをPostgreSQLテーブルに出力
df.to_sql('table_name', engine, if_exist='replace', index=False)
# if_exits='replace'は既存のテーブルを置き換える。'append'ならデータ追加
各パラメータ
name (str)
SQLテーブルの名前。
con (sqlalchemy.engine.(Engine or Connection) or sqlite3.Connection)
SQLAlchemyを使うことで、そのライブラリがサポートするどのようなDBでも使うことができる。
レガシーサポートとして、sqlite3.Connectionオブジェクトが提供される。
SQLAlchemyの接続可能なエンジンの廃棄と接続の終了は、ユーザの責任で行う。
schema (str, optional)
スキーマを指定する(データベースのフレーバーがサポートしている場合)。
Noneの場合、デフォルトのスキーマを使用する。
if_exists ({'fail', 'replace', 'append'}, default 'fail')
テーブルが既に存在する場合の動作。
fail: ValueErrorを発生させる。
replace: 新しい値を挿入する前にテーブルを削除する。
append: 既存のテーブルに新しい値を挿入する。
index (bool, default True)
DataFrameのインデックスを列として書き出す。
テーブルの列名としてindex_labelを使用する。
index_label (str or sequence, default None)
インデックス列のラベル。
None(デフォルト)が与えられ、indexがTrueの場合、インデックス名が使用される。
データフレームがMultiIndexを使用する場合は、シーケンスが与えられるべき。
chunksize (int, optional)
一度に書き込む各バッチの行数を指定する。
デフォルトでは、すべての行が一度に書き込まれる。
dtype (dict or scalar, optional)
特定の列のデータ型を指定する。
辞書を使う場合、キーは列名、値はSQLAlchemyの型、
またはsqlite3 legacy modeの場合は文字列になる。
スカラーを指定した場合は,すべてのカラムに適用される。
method ({None, 'multi', callable}, optional)
使用するSQL挿入句を制御する。
None : 標準SQLのINSERT句を使用する(1行に1つ)。
'multi': 1つのINSERT句で複数の値を渡す。
シグネチャ(pd_table, conn, keys, data_iter)を持つcallableを使用する。
CSVを読み込みJSONに変換する
to_json
オブジェクトをJSON形式の文字列に変換する。
公式のリファレンス(リンク)
戻り値: None or str
使用例
import pandas as pd
df = pd.read_csv("./data.csv")
#json形式で出力する
df.to_json("./data_pd.json", orient="records")
各パラメータ
path_or_buf(str, path object, file-like object, or None)
文字列、パス、ファイルのようなオブジェクトを指定する。
デフォルトはNone
orient(str)
JSONに変換する方法
Seriesならデフォルトはindex
DataFrameならデフォルトはcolumns
"split" 辞書 {"index" -> [index], "columns" -> [columns], "data" -> [values]}
"records" リスト [{column -> value}, … , {column -> value}]
"index" 辞書 {index -> {column -> value}}
"columns" 辞書 {column -> {index -> value}}
"values" 値の配列のみ
"table" 辞書 {"schema": {schema}, "data": {data}}
date_format(None, "epoch", "iso")
日付の変換方法
デフォルトは"epoch"
epochはエポックミリ秒(1970年1月1日00UTCからの経過秒)
isoはISO8601(2024-03-15T12:34:56など)
double_precision(int)
浮動小数点を変換するときに使用する小数点以下の桁数。
デフォルトは10。最大15。
force_ascii(bool)
変換された文字列をASCIIにする
デフォルトはTrue
date_unit(str)
タイムスタンプとISO8601の精度を制御する
デフォルトは"ms"(ミリ秒)
ほか、"us"(マイクロ秒), "ns"(ナノ秒)
default_handler
JSON形式に変換できない場合に呼び出す処理
デフォルトはNone
lines(bool)
orientが"records"のとき、行区切りのJSON形式で出力する
デフォルトはFalse
compression(str or dict)
出力データを臨機応変に圧縮するためのパラメータ
デフォルトは"infer"
index(bool or None)
orientが"split", "index", "column", "table"の場合のみ使用される。
デフォルトはNone
"index"と"column"はindex=Falseをサポートしていない。
indent(int)
各レコードのインデントに使われる空白の長さ。
その他のオプション
storage_options(dict)
mode(str)