Open4

よくデータハンドリングで使うTips

みぎみぎ

データの加工

カラム名を変更する
inplace=Trueで上書きする

df.rename(columns={'ID':'UserID', 'Created At':'UserCreatedAt'}, inplace=True)

型を変更する

# object -> datetime
df['UserCreatedAt'] = pd.to_datetime(df['UserCreatedAt'])
# フォーマット指定してdatetimeにする
df['UserCreatedAt'] = pd.to_datetime(df['UserCreatedAt'], format='%Y-%m-%d')

# その他
df['amount'] = df['amount'].astype('int64')
df['amount'] = df['amount'].astype('floatt64')
df['amount'] = df['amount'].astype('object')
df['amount'] = df['amount'].str()

DataFrameの結合

# on:key、how:結合方法
df = pd.merge(df, sub_df, on='UserID', how='outer')

重複列を除外する
結合した後にレコードが膨らむことがあるのでチェックする

df.drop_duplicates(inplace=True)

特定のカラムに名称をmappingする

# mapping用のdict
# 変更時に参照するカラムの値:変更後の値
label_name = {
    1.0 : 'エンジニア',
    2.0 : 'デザイナー',
    3.0 : 'その他'
}

df['biz_type_name'] = df['biz_type_id'].map(label_name)

ある列にデータが入っていないレコード(行)を除外する
NaNやNaTの除外

df.dropna(subset=['paymentID'], inplace=True)

lambda式

日付の値がobject型の2019-09-26T19:10:29のようなとき、Tより前の2019-09-26だけを取り出して、
datetimeにしたい。

df['create_at'] = pd.to_datetime(df['Created At'].apply(lambda x:x[0:10]))

年代を作る

# 0-80歳を5歳刻み
# right 左右どちらかのエッジを含めるか指定する引数。right=Falseで右のエッジがbinに含まれなくなる
pd.cut(df['age`], bins=np.arange(0, 80, 5), right=False)
みぎみぎ

計算系

レコード数を数える

# レコード数
df['user_id'].count()

# ユニークなレコード数
df['user_id'].nunique()

# 欠損値を数える
df['user_id'].isnull().sum()

groupby

複数カラムに関して、それぞれ計算方法を指定する

# dfをuser_idでgroupbyして、col1についてはcount、col2についてはsum、col3についてはmeanを計算する
groupby_df = df.groupby('UserID').agg({'col1':'count', 'col2':'sum', 'col3':'mean'}).reset_index()

累積和

上位何%を出す時など

df['accum'] = np.cumsum(df['Amount']) # 累積和
df['accum_percent'] = round(df['accum'] / sum(df['Amount']) * 100, 3) # 累積%
みぎみぎ

その他Tips

NaT判定

pd.isnull(x) == TrueならNaT

# datetime型のnatがNaTか否か。
if pd.isnull(nat) == True:
    print('NaT')
else:
    print('No')

特定カラムから存在する値のリストを取得する

df['col1'].unique().tolist()
みぎみぎ

準備系

importするライブラリ

# ライブラリのインポート
import numpy as np
import pandas as pd

# 可視化ライブラリ
import matplotlib.pyplot as plt
import plotly.express as px
import seaborn as sns
sns.set()

#Recencyの計算用
import datetime
import math

# 年齢/設立年算出のため
import datetime
from dateutil import relativedelta

# 図の日本語ライブラリ
import japanize_matplotlib

# 実害のないWarningを無視
import warnings
warnings.filterwarnings('ignore')

%matplotlib inline

notebook設定

表示列の指定

#最大表示列数の指定(ここでは50列を指定)
pd.set_option('display.max_columns', 50)