アウトプット&メモ。
pandas読み込み
import pandas as pd
from pandas import Series, DataFrame
条件で行を抽出
サンプルデータはこんな感じ。
# データの準備
data = {'ID':['100','101','102','103','104']
,'city':['Kyoto','Osaka','Tokyo','Hokkaido','Okinawa']
,'birth_year':[1980,1999,1995,1970,1994]
,'name':['A','B','C','D','E']}
sample_data = pd.DataFrame(data)
上記を例にデータ加工する。
boolリストで返す。
# 1990年より前に産まれた人
sample_data["birth_year"] < 1990
boolリストを使って行を抽出
もちろん複数条件も可能。
あとは値を代入するなり、平均出したりするだけ。
# sample_data[]の中にboolリストを突っ込んであげるだけ
sample_data[sample_data["birth_year"] < 1990]
loc
個人的にはこっちを一番使う。
loc[ 行の指定, 列の指定 ]
# 1990より前に産まれた人の行と、全て(:)のカラムを抽出。
sample_data.loc[sample_data['birth_year'] < 1990, :]
query()
こちらでも、条件で行を抽出できる。文字列は""で囲む必要があるので注意。
sample_data.query('birth_year < 1990 & name == "A"')
文字列の部分一致で行を取得
str.contains()を使うと、特定の文字列を含む場合Trueになる。
NaNがある時に行を抽出するとエラーとなるので、引数にna=Flaseとしよう。
sample_data[sample_data['city'].str.contains('Osa')]
↓ 他にも以下の方法もできる。
説明 | |
---|---|
str.startswith() | 特定の文字列で始まる |
str.endswith() | 特定の文字列で終わる |
列の要素を置換
map()
cityを区域で置換して新しいカラム(region)に入れる。
# 参照データ
map_data = {'Kyoto':'Kansai',
'Osaka':'Kansai',
'Tokyo':'Kanto',
'Hokkaido':'Hokkaido'}
# 参照データで置換
sample_data ['region'] = sample_data ['city'].map(map_data)
置換できなかった要素はNaNになる。
replace()
map()と同じだが、置換後の値が異なる。
# 参照データ
map_data = {'Kyoto':'Kansai',
'Osaka':'Kansai',
'Tokyo':'Kanto',
'Hokkaido':'Hokkaido'}
# map()と同じ参照データで置換
sample_data ['region'] = sample_data ['city'].replace(map_data)
置換できなかった要素は元の値を引き継ぐ
要素の一部を取り出す
map()と無名関数の組み合わせ技
ループなどを使って取り出すより、こちらの方が処理速度が優れているので、まとめて処理したい場合はこちらがおすすめ。
birth_yearの上3文字を取り出して、19〇0年産まれか分かるようにする。
# birth_year の上3つの数字・文字を取り出す
sample_data ['up_two_num'] = sample_data ['birth_year'].map(lambda x:str(x)[0:3])
指定した範囲でデータを分割
cut()
birth_yearを指定範囲で分割する。
# 分割の粒度
bins = [1970,1980,1990,2000]
# 分割実行。
birth_cut_data = pd.cut(sample_data.birth_year, bins)
value_counts()
上記で分割した後にカウントをとる。
pd.value_counts(birth_year_cut_data)
文字列でも同じようにカウントしたい場合
可視化が捗る。
sample_data.groupby["city"].size()
分割数を指定することも可能。
# birth_yearの (min + max) /2 の値を境に分割 => (1980 + 1999) / 2 = 1989.5
birth_cut_data = pd.cut(sample_data.birth_year, 2)
qcut()
分位点での分割も可能
# 分位点で分割、ここでは2を指定しているので中央値(1994)が境になる
birth_qcut_data = pd.qcut(sample_data.birth_year, 2)
# カウント
pd.value_counts(birth_qcut_data)
重複判定
サンプルにするデータ
# 重複データのサンプル
dupli_data = DataFrame({'column1':[1,2,2,3,4,4,6,6]
,'column2':['a','b','b','c','c','c','b','b']})
duplicated()
重複行があるか判定する。重複している場合はTrue
dupli_data.duplicated()
drop_duplicates()
重複行の削除
# 重複削除。Trueを削除
dupli_data.drop_duplicates()
[番外]統計関数
データ加工と組み合わせて使ったりするnumpyの関数おさらい。
# numpy読み込み。
import numpy as np
関数 | 説明 |
---|---|
min() | 最小値 |
max() | 最大値 |
median() | 中央値 |
mode() | 最頻値 |
mean() | 平均 |
sum() | 合計 |
var() | 分散 |
std() | 標準偏差 |