【Python】pandas:Dataframeあれこれ

毎回忘れるからメモ。

import

import pandas as pd

結合

基本的な使い方

# 内部結合
data = pd.merge(df_1, df_2, on="COLUMN_A", how="inner")

# 左外部結合
data = pd.merge(df_1, df_2, on="COLUMN_A", how="left")

# 右外部結合
data = pd.merge(df_1, df_2, on="COLUMN_A", how="right")

# 両外部結合(出番あんのかこれ)
data = pd.merge(df_1, df_2, on="COLUMN_A", how="outer")

同一のカラム名が存在した場合の対応

# suffixesで指定する
data = pd.merge(df_1, df_2, on="COLUMN_A", how="inner", suffixes=["", "_df2"])

特定列の抽出

dataframe型のまま列を指定して抽出

df = df[["COLUMN_A"]]

特定列の削除

df = df.drop(columns=["COLUMN_A", "COLUMN_B", "COLUMN_C"])

特定行の抽出

条件指定して抽出

indexで指定可能。queryを使う。

df = df.query("index % 5 == 1")

こっちの方が使いやすい

df = df[(2015 <= df.YEAR) & (df.YEAR <= 2017)]

特定の文字列を含む行を抽出する

df = df[df["KAISAI_NENGAPPI"].str.contains(2018)]

groupby

普通にgroupby

# RACE_CODEごとにグループ化して最大値を取得
max_data = df.groupby("COLUMN_A").max()

# グループ化する値をインデックスにしたくないとき
max_data = df.groupby("COLUMN_A", as_index=False).max()

groupbyして採番したいとき

# KAISAI_NENGAPPIごとに採番してカラムINDEXに入れる
df["INDEX"] = df.groupby("COLUMN_A").cumcount()+1

groupbyしてからの処理

applyとtransformの違いは以下参照。

Pandas の transform と apply の基本的な違い - Qiita
Pythonのデータ分析ライブラリpandasのgroupby オブジェクトに使う transform と apply の違いについて、整理したいと思います。ドキュメンテーションなんでちゃんと書いて…

各列の型を確認

print(df.dtypes)

特定列の型変換(キャスト): astype()

# floatに変換
df["COLUMN_A"] = df["COLUMN_A"].astype(float)

indexのリセット:reset_index

# drop=trueで元のインデックスを削除
df = df.reset_index(drop=True)

列数取得

print(len(df.columns))

行数取得

print(len(p_data))

ソート:sort_values()

df = df.sort_values("COLUMN_A")

昇順、降順:ascending

# True:昇順、False:降順
df = df.sort_values("COLUMN_A", ascending=True)

複数カラムでソート:[]

# カラムを[]で囲む
df = df.sort_values(["COLUMN_A", "COLUMN_B"], ascending=True)

各カラムごとにソート:ascending[]

df = df.sort_values(["COLUMN_A", "COLUMN_B"], ascending=[True, False]) 

順位付け(ランク)

基本の使い方はデータフレーム全体(列方向)に順位付けがされる。デフォルトでは「各列が昇順で順位付け」され、「同一値(重複値)は平均順位」となり、「文字列はアルファベット順に比較 」される。

df.rank()

昇順、降順はascendingで指定

# accenbing=True で昇順(デフォルト)
df.rank(ascending=True)

# accenbing=False で降順
df.rank(ascending=False)

同一値(重複値)の処理:method

# method="min"で最小値(1位タイとか)
df.rank(method='min')

# method="max"で最大値
df.rank(method='max')

# method="average"で平均値
df.rank(method='average')

groupbyと組み合わせる。

# COLUMN_Aでグループ化し、COLUMN_Bの値を順位付け(降順、同一値は最小値)し、
# 順位をCOLUMN_RANKとして列追加
df["COLUMN_RANK"] = df.groupby("COLUMN_A")[COLUMN_B].rank(ascending=False, method='min')

欠損値(NaN)を別の値で置換する:fillna

# 0で置換
uma_data = uma_data.fillna(0)

列名に特定の文字列が含まれる列名を検索

# "SOHA_TIME"が含まれる文字列を検索
include_cols = [col for col in test_data.columns if 'SOHA_TIME' in col]

コメント