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)