LoginSignup
974

More than 5 years have passed since last update.

Python Pandasでのデータ操作の初歩まとめ − 前半:データ作成&操作編

Last updated at Posted at 2015-03-09

はじめに

Pythonでデータ分析を扱う上で必須となる、Pandasでのデータ操作方法の
初歩についてまとめました。

ついつい忘れてしまう重要文法から、ちょっとしたTipsなどを盛り込んでいます。

こんな人にオススメ
→ Pandasを初めて触ってみたい!
→ Rが使えることをPythonでもやってみてーなー
→ Pandasの文法覚えきれねー どっかに一覧があれば便利なのに...
→ そもそもPythonでデータハンドリングってどれくらいできるものなのさ

こちらも合わせてどうぞ
◆Pandasでデータ操作:Pandas_plyを使う
http://qiita.com/hik0107/items/3dd260d9939a5e61c4f6

データを作ってみよう

まず最初にPandasをインポートし、適当にデータフレーム形式のデータを作る
data_creation.py
import pandas as pd

df_sample =\
pd.DataFrame([["day1","day2","day1","day2","day1","day2"],
              ["A","B","A","B","C","C"],
              [100,150,200,150,100,50],
              [120,160,100,180,110,80]] ).T  #とりあえず適当なデータを作ります

df_sample.columns = ["day_no","class","score1","score2"]  #カラム名を付ける
df_sample.index   = [11,12,13,14,15,16]  #インデックス名を付ける

◆Column / Index Access

特定の列やインデックス番号にアクセス
col_index_access.py

df_sample.columns   #列名を取得 
df_sample.index     #インデックス名を取得


df_sample.columns = ["day_no","class","point1","point2"]   # カラム名を上書き
df_sample.index   = [11,12,13,14,15,16]   # インデックス名を上書きする


# Renameメソッドを使う
df_sample.rename(columns={'score1': 'point1'})  #対応関係を辞書型で入れてやる

◆データの構造を確認する

データの概要を見てみる
datacheck.py
# 行数の確認
len(df_sample)

# 次元数の確認
df_sample.shape #(行数、列数)の形で返す

# カラム情報の一覧
df_sample.info() #カラム名とその型の一覧

# 各列の基礎統計量の確認
# Rでいうところのsummary()
df_sample.describe() # 平均、分散、4分位など

# head / tail
df_sample.head(10) #先頭10行を確認
df_sample.tail(10) #先頭10行を確認

データをいじってみよう

データから特定の列だけを選択する
datacheck.py
#組み込み関数__get_item___を使った選択
df_sample["day_no"] #列名を書いて指定
df_sample[["day_no","score1"]] 複数列を選択する場合にはリスト表記を使う

# locを使った列選択
# 文法 :iloc[rows, columns]の形で書く
# 列だけでなく行も同時にSubsettingできる
df_sample.loc[:,"day_no"]  # 行は全てを選択するために「:」を入れている。
df_sample.loc[:,["day_no","score1"]] 複数列を選択する場合にはリスト表記を使う     

# ilocを使った列選択
# 文法 :iloc[rows番号, columns番号]の形で書く
df_sample.iloc[:,0]  # 番号で選択
df_sample.iloc[:,0:2] #複数で連番の場合。リスト表記でも行ける


# ixを使った列選択
# 列名と列番号両方が使える。基本これを使っておけば良い感
df_sample.ix[:,"day_no"] # なお、単列選択の場合には結果はPandas.Series Object
df_sample.ix[:,["day_no","score1"]] # 複数列選択の場合には結果はPandas.Dataframeになる

df_sample.ix[0:4,"score1"] # 行は番号で、列は列名で選択することもできる


series_bool = [True,False,True,False]
df_sample.ix[:,series_bool]  #また、Booleanの配列でも選択できる


#列名の部分一致による選択
#R DplyrにはSelect(Contains())という、列名部分一致選択のための便利スキームがある
#Pandasにはそれに該当する機能はないため、少し工程を踏む必要がある

score_select = pd.Series(df_sample.columns).str.contains("score") # "score"を列名に含むかどうかの論理判定
df_sample.ix[:,np.array(score_select)]   # 論理配列を使って列選択

◆Subsetting

条件文に基づいたデータの部分選択を行います
subsetting.py
## Pythonのデフォルトの表記
## データフレーム[Booleanの配列を入れる]
df_sample[df_sample.day_no == "day1"]  # day_no列がday1のデータのみを選択
series_bool = [True,False,True,False,True,False]
df_sample[series_bool] # データフレーム自身の列以外も当然条件に使える


##Pandasのqueryメソッドを使った場合の表記
df_sample.query("day_no == 'day1'")  
     # データフレーム名を2度書く必要が無いため、すっきりする
     # 条件式はStr形式で入れてやらなければならないことに注意

df_sample.query("day_no == 'day1'|day_no == 'day2'")
     # 複数条件の場合は、or条件の "|" もしくは and条件の "&"を間に入れてやる

select_condition = "day1"
df_sample.query("day_no == select_condition")  # ☓ doesn't work
        # 抽出の条件式はstr表記なので、変数名を直接入れると反応しない

df_sample.query("day_no == @select_condition")  # ◯ it works
        # 変数を使いたい場合には、変数名のアタマに@をつけると、変数名として認識する


## indexを使ってSubsetting
df_sample.query("index == 11 ")  # 普通にindexと書いてやれば動く
df_sample.query("index  in [11,12] ") # or条件には、「in」も使える

◆Sorting

データの並び替えを行います。
sorting.py
df_sample.sort("score1")  # Score1の値で昇順でソート
df_sample.sort(["score1","score2"])  # Score1とScore2の値で昇順でソート


df_sample.sort("score1",ascending=False)  #score1の値で降順でソート

◆pandas.concat

データの結合による、レコードや列の追加を行います。 
concat.py

# 行の追加
#追加したいデータを適当に作ります。データフレーム同士の結合を考えます。
#df_sampleにインデックス「17」をもつレコード追加する場合を想定してみます。 

df_addition_row =\
    pd.DataFrame([["day1","A",100,180]])  #df_sampleと同じ列構造を持つDFを作成
df_addition_row.columns =["day_no","class","score1","score2"]  #同じ列名を付ける
df_addition_row.index   =[17] #インデックスをふる

pd.concat([df_sample,df_addition_row],axis=0)  #結合を行う =rbind
        # 第一引数:結合するDFを[]表記で指定する。
      # 第二引数:Axis=0で縦方向の結合であることを指定する。


# 列の追加
# Score1、Score2に加えて、Score3の列を追加することを考えます。
# 追加したいデータを適当に作ります。データフレーム同士の結合を考えます。

df_addition_col =\
    pd.DataFrame([[120,160,100,180,110,80]]).T #df_sampleと同じ行数を持つDFを作成

df_addition_col.columns =["score3"] #列名は結合後にもそのまま使われる
df_addition_col.index   = [11,12,13,14,15,16] 
         #注意!! pandas.concatは結合するもの同士のインデックスが同じ構造でないと、思ったような作用をしません!(後述)


pd.concat([df_sample,df_addition_col],axis=1) #axis=1は横方向の結合を指定します。


# インデックスについて
# 新しいデータのインデックスが結合先と違う場合、データは互い違いな形で結合されます。
# 下記を試してみて下さい

df_addition_col =\
    pd.DataFrame([[120,160,100,180,110,80]]).T

df_addition_col.columns =["score3"]
df_addition_col.index   = [11,12,13,21,22,23]   #一部はもとのデータとインデックスが一致するが、一部は一致しない


pd.concat([df_sample,df_addition_col],axis=1)  # 結果は....

◆Joining

2つのデータをあるKeyを元に結合します。
join.py
## 作成途中

後半に続く

◆Python Pandasでのデータ操作の初歩まとめ − 後半:データ集計編
http://qiita.com/hik0107/items/0ae69131e5317b62c3b7

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
974