工作と競馬2

電子工作、プログラミング、木工といった工作の記録記事、競馬に関する考察記事を掲載するブログ

pandas自分用覚書

ファイル読み取り

Excel

df = pd.read_excel(io=ファイル名, sheet_name=シート名)

CSV

# 基本形
df = pd.read_csv(ファイルパス)

# ヘッダがある
df = pd.read_csv(ファイルパス, header=0)

# 列名がないときに自分で与える
df = pd.read_csv(ファイルパス, names=[列名, ...])

# 列名をインデクス(行ラベル)として与える
df = pd.read_csv(ファイルパス, index=[列名, ...])

# Windows環境で日本語パスを含む
# https://teratail.com/questions/167493
pd.read_csv(ファイルパス, engine="python")

ファイル書き出し

CSV

df.to_csv(ファイルパス, index=boolean)

基本的な情報表示

# 基本統計量
df.describe(include='all') # allは質的データ(カテゴリ変数)についても計算する

# 列名の表示
df.columns

# 列のデータ型の表示
df.dtypes
# 特定データ型の列の抽出
df[df.columns[df.dtypes=データ型]]

# 項目ごとの件数を算出
df.value_counts()

# ユニークなデータ
u = データ.unique()

基本的な編集

# インデクス作成
# 行番号をカラムにする
df.reset_index()
# 指定したカラムをインデクスにする
df.reset_index(カラム)

# 日時関連の型変換
pd.to_datetime(日時文字列のカラムデータ).astype(型名)
datetime型の値.date() --- 日付のみ取り出し
datetime型の値.day_name() --- 曜日名の取り出し

# グループ化
df.groupby(カラム名)

# ソート
df.sort_values(カラム名)
# 降順
df.sort_values(ascending=False)


# 列名の割り当て
data.columns = [列名1, 列名2, ...]

# カラム名のリネーム
df.rename(columns={
    変更前のカラム: 変更後のカラム,
    :
})
  • グループ化して処理を適用
df.groupby(カラム名).apply(lambda関数)
  • 結合
pd.merge(データ1, データ2, on=カラム名, how=結合方法)

結合方法="inner"
  • データ集合
集合=set(df)
  • 積集合
集合1.intersection(集合2)
  • 条件
condition = 条件式

例えば、 df[カラム名]==3

df[condition]で、conditionを満たすものが取り出せる
  • カテゴリ変数を数値に変換
dummies = pd.get_dummies(df)
  • 数値をカテゴリ変数に変換(get_dummiesの逆)
sr = df.idxmax(axis=1)

DataFrame

  • 指定位置の値取り出し

    • r行c列の値を取り出す。
    • コロンですべて指定もできる
df.loc[r, c]

df.loc[r, :] # r行のすべて

df.loc[[r1, r2, ...], :] # r1, r2, ...行をすべて
  • インデクスを指定した取り出し
df.loc[インデクス]
  • 先頭データの確認
df.head(行数)
  • 列(データ型)の情報
df.info()
  • サイズの確認
(行数, 列数) = df.shape # 二次元の場合
  • データ型の対応

PythonのリストなどからDataFrameにした場合

int -> np.int64
float -> np.int64
bool -> np.bool8
datetime.datetime -> np.dtype("datetime64[ns]")
str -> np.dtype("object")

# 特定のデータ型の列を抽出
df.dtypes == np.int64 # intの列だけ
  • カラム取り出し
series = df[カラム名] # 1つの列名を指定するとSeriesが返る
df2 = df[[カラム名1, カラム名2, ...]] # リストで指定するとDataFrameが返る
  • カラム削除
df.drop(カラム名, axis=1)
df.drop([カラム名1, ...], axis=1) # 複数
  • 質的データ(カテゴリ変数)の確認

    • カテゴリ変数内に出現するカテゴリ名ごとの出現数
df.value_counts()
カテゴリ名1      出現数
:                         :
Name: カテゴリ変数名, dtype: int64
  • ある列のすべての値に関数を適用
def func(x):
    :
   return 処理結果

df[列名] = df[列名].map(func)

欠損値

# 戻り値は欠損かどうか(True/False)のDataFrame
df_null = df.isnull()

# 列ごとの欠損値の数
df.isnull().sum()

# 1つでもTrueが含まれる行がTrueになる
df.isnull().any(axis=1) 

# 欠損値のある行を抽出
df[df.isnull().any(axis=1)]

# ある列で欠損値のない行のみ抽出
df = pd[~pd[列名].isnull()]

# ある列で欠損値のある行を削除
df = pd.dropna(df)
df = pd.drop(df.isnull()) # これでもいい

# 欠損値への代入
# ある列の欠損を値vで埋める
df[列名].fillna(v, inplace=上書き可否(bool)) 

重複

# 重複データの確認
# 重複行のうち、初めに見つかった方はFalse
df.duplicated()

# 重複データだけ抽出
df[df.duplicated()] 

# 重複データの削除
df.drop_duplicates(inplace=上書き可否(bool)) 

# 削除後に、インデクス振りなおし
df.reset_index(drop=True, inplace=True)

可視化

import matplotlib.pyplot as plt
df.plot(kind=グラフの種類)
df.hist() # ヒストグラム
df.hist(figsize=(w, h)) # グラフ窓の大きさ指定できる[inch]
plt.tight_layout() # グラフの軸ラベルが重ならないように表示を調整
plt.show()

DataFrame, Seriesの連結

参考

df1

a11 a12 a13
a21 a22 a23
a31 a32 a33

df2

b11 b12 b13
b21 b22 b23
b31 b32 b33

のとき

df = pd.concat([df1, df2])
# または
df = pd.concat([df1, df2], axis=0)

結合後

a11 a12 a13
a21 a22 a23
a31 a32 a33
b11 b12 b13
b21 b22 b23
b31 b32 b33
  • 列方向で連結したいとき

    df1 a11 a12 a13 a21 a22 a23 a31 a32 a33

    df2 b11 b12 b13 b21 b22 b23 b31 b32 b33

    python df = pd.concat([df1, df2], axis=1)

    結合後

    a11 a12 a13 b11 b12 b13 a21 a22 a23 b21 b22 b23 a31 a32 a33 b31 b32 b33

DataFrameからの抽出方法いろいろ

  • あるカラムの値を指定して
df[df[カラム名] == 値]
df.query('カラム名 == 値') # 文字列として渡すこと
df.query('カラム名 == 値 & カラム名 == 値') # 条件が複数の時、&, and, |, orなど

# 変数も使える
val = ***
df.query('カラム名 > @val')

DataFrameの一部データの削除

df = pd.drop([列名, ...])
# または
df = pd.drop([列名, ...], axis=0)
# または
df = pd.drop(index=[行名, ...])
df = pd.drop([列名, ...], axis=1)
# または
df = pd.drop(columns=[列名, ...])

相関

  • 相関行列
df.corr()

# 見づらい場合はヒートマップ(matplotlib, seaborn使用)
plt.figure(figsize=(10,8))
sns.heatmap(df.corr(), vmin=-1.0, vmax=1.0, annot=True, cmap='coolwarm', linewidths=0.1)
  • 指定したカラム同士の相関
df[[カラム名1, カラム名2]].corr()

参考