LoginSignup
41
64

More than 5 years have passed since last update.

[Python] pandas データ加工

Last updated at Posted at 2018-09-19

アウトプット&メモ。

pandas データ結合 編

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)

image.png

上記を例にデータ加工する。

boolリストで返す。

# 1990年より前に産まれた人
sample_data["birth_year"] < 1990

image.png

boolリストを使って行を抽出

もちろん複数条件も可能。
あとは値を代入するなり、平均出したりするだけ。

# sample_data[]の中にboolリストを突っ込んであげるだけ
sample_data[sample_data["birth_year"] < 1990]

image.png

loc

個人的にはこっちを一番使う。
loc[ 行の指定, 列の指定 ]

# 1990より前に産まれた人の行と、全て(:)のカラムを抽出。
sample_data.loc[sample_data['birth_year'] < 1990, :]

image.png

query()

こちらでも、条件で行を抽出できる。文字列は""で囲む必要があるので注意。

sample_data.query('birth_year < 1990 & name == "A"')

image.png

文字列の部分一致で行を取得

str.contains()を使うと、特定の文字列を含む場合Trueになる。
NaNがある時に行を抽出するとエラーとなるので、引数にna=Flaseとしよう。

sample_data[sample_data['city'].str.contains('Osa')]

image.png

↓ 他にも以下の方法もできる。

説明
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)

image.png

置換できなかった要素はNaNになる。

replace()

map()と同じだが、置換後の値が異なる。

# 参照データ
map_data = {'Kyoto':'Kansai',
           'Osaka':'Kansai',
           'Tokyo':'Kanto',
           'Hokkaido':'Hokkaido'}
# map()と同じ参照データで置換
sample_data ['region'] = sample_data ['city'].replace(map_data)

image.png

置換できなかった要素は元の値を引き継ぐ

要素の一部を取り出す

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])

image.png

指定した範囲でデータを分割

cut()

birth_yearを指定範囲で分割する。

# 分割の粒度
bins = [1970,1980,1990,2000]

# 分割実行。
birth_cut_data = pd.cut(sample_data.birth_year, bins)

image.png

value_counts()

上記で分割した後にカウントをとる。

pd.value_counts(birth_year_cut_data)

image.png

文字列でも同じようにカウントしたい場合

可視化が捗る。

sample_data.groupby["city"].size()

image.png

分割数を指定することも可能。

# birth_yearの (min + max) /2 の値を境に分割  =>  (1980 + 1999) / 2 = 1989.5
birth_cut_data = pd.cut(sample_data.birth_year, 2)

image.png

qcut()

分位点での分割も可能

# 分位点で分割、ここでは2を指定しているので中央値(1994)が境になる
birth_qcut_data = pd.qcut(sample_data.birth_year, 2)

# カウント
pd.value_counts(birth_qcut_data)

image.png

重複判定

サンプルにするデータ

# 重複データのサンプル
dupli_data = DataFrame({'column1':[1,2,2,3,4,4,6,6]
                       ,'column2':['a','b','b','c','c','c','b','b']})

image.png

duplicated()

重複行があるか判定する。重複している場合はTrue

dupli_data.duplicated()

image.png

drop_duplicates()

重複行の削除

# 重複削除。Trueを削除
dupli_data.drop_duplicates()

image.png

[番外]統計関数

データ加工と組み合わせて使ったりするnumpyの関数おさらい。

# numpy読み込み。
import numpy as np
関数 説明
min() 最小値
max() 最大値
median() 中央値
mode() 最頻値
mean() 平均
sum() 合計
var() 分散
std() 標準偏差
41
64
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
64