【データ分析】Pandasチートシート!

2025年4月3日

はじめに

みなさんPandas使ってますか!!!使ってるとなんども行う処理の書き方よく忘れますよね…
私がデータ分析でよく使うものをまとめました。目次からご活用ください。

準備

pipインストール

$ pip install pandas

pandasのインポート

import pandas as pd

Pandasデータフレームの変換

データフレーム型への変換

リストから

空のデータフレームを作成、またはほかの型からデータフレームへの変換

引数はオプション
data:データフレームにするリスト型、辞書型等
index:インデックスにするカラム
columns:カラム名を指定

df = pd.DataFrame(data [,index] [,columns])

シリーズから

pd.seriesからpd.dataframeに変換

df = series.to_frame()

データフレーム型の変換

リスト型に変換

df_list = df.to_list()
df_list = df.index.to_list()
df_list = df["column1"].to_list()

辞書型に変換

df_dict = df.to_dict()

入力・出力

csv読み込み

csvからデータフレームを作成。パス以外はオプション。

df = pd.read_csv('data/src/sample.csv',
  header=None,
  index_col=0,
  names=['A', 'C'],
  usecols=['a', 'c'],
  parse_dates=['date']
)

xlsx読み込み

pd.read_excel()を使う場合は以下をインストールしてインポートが必要

$ pip install openpyxl
import openpyxl

パス以外はオプション。

df = pd.read_excel('data/src/sample.xlsx',
  sheet_name='sheet2',
  header=5,
  index_col=0,
  usecols=["B:T"],
)

csv出力

df.to_csv(f"./data.csv", encoding="utf-8", errors="ignore", index=True)

インデックスの処理

df = df.index

特定の列をインデックスとして使用する

df = df.set_index("date")

インデックスをリセットして振り直す

df = df.reset_index("date")

列名変更

renameする方法とcolumnsを指定する方法がある。
renameは辞書型、columnsはリスト型

df = df.rename(columns={"A":"a"})
df.columns = ["a","b"]

columns_list = df.columnsでカラム名をリストで取得することもできます。

追加

列追加

df["column"] = 1
df.insert(1, "column", "str")

削除

特定列の削除

df = df.drop(sunet=['A'], axis=1)

特定行の削除

df = df.drop(sunet=['A'], axis=0)

欠損列、欠損行の削除

df = df.dropna(axis=1, how = 'all')
df = df.dropna(axis=0, how = 'any')

重複行削除

df.drop_duplicates(subnet="date", keep"first", inplace=True)

型変換

datetime型に変換する場合。formatはオプション

df[date] = pd.to_datetime(df[date], format="%Y%m%d")

float型などに帰る場合

df = df.astype({'columns1': object, 'columns2': 'float64', 'columns3': 'category'}) 

型を確認する場合

df.dtypes

抽出

行抽出

空もしくは空ではないの行の抽出

「 | 」でつなぐことでor、「&」でand

df = df[df[column1].isnull()]
df = df[df[column1].notnull() | df[column2]notnull()]
df = df[df[column1].notnull() & df[column2]notnull()]

数値

df = df[df[column1] > 10]

文字列

df = df[df[column1].isin(["a"])]
df = df[df[column1].str.contains("a")]

列抽出

df = df[1:3]
df = df.loc[:,["column1"]]

欠損値埋め

df["column1"] = df["column1"].ffill()
df["column1"] = df["column1"].bfill()

結合

縦結合

結合するデータフレームはリストに格納する。

df = pd.concat([df1, df2], ignore_index=False)

マージ

df = pd.merge(df_a, df_b, on=["date"], how="left")
df = pd.merge(df_a, df_b, on=["date"], how="outer")

ジョイン

df = df_a.join(df_b, how="left")

並び替え

行の並び替え

df.sort_values("date", ascending=False, ignore_index=True)
df.sort_values(["column1",”column2”])
df.sort_index(axis=1)

列の並び替え

df = df.reindex(index={‘column1’,’column3’,’column2’})

グループ化

集計

特定の列でグループ化して算出
sum:合計
mean:平均
apply:自分で定義した関数で算出

df = df.groupby(df["date"]).mean()
df = df.groupby(df["date"]).apply(lambda x: x.count())

aggを用いると特定の列に対してそれぞれの計算が可能。

df = df.groupby(df.index).agg({
  "column1": "sum",
  "column2": "mean",
  "column4": lambda x: x.count(),
})

月別集計

Y:1年 M:1か月 D:1日 10h:10時間 10min:10分  10s:10秒
MSのようにSを付けると集計する際にindexの日付を月初になる。(例:1月1日)

df.resample("MS").ave()
df.resample('W').apply(list)

resampleもグループ化の時と同様にaggが使用可能

df.resample("MS").agg({
  "column1": "sum",
  "column2": "mean",
  "column3": "ave",
  "column4": lambda x: x.count(),
})

条件に応じた処理

df["column1"] = np.where(df["column2"]==1,True,False)

列のデータ処理

datetime型の丸め

df["datetime_round"] = df["datetime"].dt.floor("min")
df["weekday"] = df["date"].dt.weekday

文字列の置換

df["column"] = df["column"].str.replace("\n","")

転置

ret = df.melt(id_vars=[""], var_name="")
df = ret.pivot(index[""],columns="",value="value").rest_index()

その他

複製

df_cp = dfとすると参照渡しになってしまう
参照渡ししたくない場合は.copyメソッドを使用する。

df_cp = df.copy(deep=True) 

列の最大値を取得

max = df["column"].max()

データフレームが空か確認

dfが空ならばTrueが返されます。

df.empty

移動平均

指数平滑移動平均

df[] = df[].ewm(5).mean.shift()