Python Pandas DataFrame(データフレーム)操作 | エド金融道 (息子が「めしが食える大人になる」編)

Python Pandas DataFrame(データフレーム)操作

列をインデックスに変換するset_index
# python 3.x
import pandas as pd
df = pd.DataFrame([
    (1,2,None),
    (None,4,None),
    (5,4,7),
    (5,5,None)], 
    columns=['a','b','d'])
df.set_index('b',inplace=True)
これで、b列がインデックス値にセットされる。

値の取得方法 dfをデータフレーム型変数とする

INDEX名

df.index.values

配列が戻り値

カラム名

df.columns.values

配列が戻り値

値の取得

df.at['キー', 'カラム名']

df.iat[0,0]

※iatの場合は、行番号、列番号で指定。

複数の値の取得

複数の値にアクセスする場合は、リスト[a, b, c, ...]やスライスstart:stop:stepでデータの範囲・位置を指定する。pandas.Seriesまたはpandas.DataFrameが返される。
スライスは通常のスライスと同じ書き方。stepは省略可。
スライスstart:stop:stepで指定するとき、ilocで行番号・列番号を使う場合は通常のスライスと同様にstopの一つ前までになるが、locで行名・列名を使う場合はstopも含まれるので注意。

print(df.loc['Bob':'Dave', 'age'])
print(type(df.loc['Bob':'Dave', 'age']))
# name
# Bob        42
# Charlie    18
# Dave       68
# Name: age, dtype: int64
# <class 'pandas.core.series.Series'>

print(df.loc[:'Dave', ['age', 'point']])
print(type(df.loc[:'Dave', 'age':'point']))
#          age  point
# name               
# Alice     24     64
# Bob       42     92
# Charlie   18     70
# Dave      68     70
# <class 'pandas.core.frame.DataFrame'>

print(df.iloc[:3, [0, 2]])
print(type(df.iloc[:3, [0, 2]]))
#          age  point
# name               
# Alice     24     64
# Bob       42     92
# Charlie   18     70
# <class 'pandas.core.frame.DataFrame'>

列・行を取得

インデックス参照df[]で行・列を選択できるが、以下の指定方法に限られる。
行の選択 : 行名・行番号のスライス
列の選択 : 列名、または、列名のリスト
print(df['Bob':'Ellen'])
#          age state  point
# name                     
# Bob       20    CA     92
# Charlie   30    CA     70
# Dave      40    TX     70
# Ellen     24    CA     88

print(df[:3])
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       20    CA     92
# Charlie   30    CA     70

print(df['age'])
# name
# Alice      24
# Bob        20
# Charlie    30
# Dave       40
# Ellen      24
# Frank      30
# Name: age, dtype: int64

print(df[['age', 'point']])
#          age  point
# name               
# Alice     24     64
# Bob       20     92
# Charlie   30     70
# Dave      40     70
# Ellen     24     88
# Frank     30     57

 

loc, ilocで行・列を選択する場合はインデックス参照df[]よりも柔軟に指定できる。
loc, ilocで列の指定を省略すると行の参照になる。インデックス参照では出来ない行名・行番号単独での指定やリストによる指定も可能。

print(df.loc['Bob'])
print(type(df.loc['Bob']))
# age      20
# state    CA
# point    92
# Name: Bob, dtype: object
# <class 'pandas.core.series.Series'>

print(df.iloc[[1, 4]])
print(type(df.iloc[[1, 4]]))
#        age state  point
# name                   
# Bob     20    CA     92
# Ellen   24    CA     88
# <class 'pandas.core.frame.DataFrame'>

loc, ilocで行の指定を:(全体のスライス)にすると列を参照できる。インデックス参照では出来ないスライスによる指定が可能。ilocで列番号を使うことも可能。

print(df.loc[:, 'age':'point'])
print(type(df.loc[:, 'age':'point']))
#          age state  point
# name                     
# Alice     24    NY     64
# Bob       20    CA     92
# Charlie   30    CA     70
# Dave      40    TX     70
# Ellen     24    CA     88
# Frank     30    NY     57
# <class 'pandas.core.frame.DataFrame'>

print(df.iloc[:, [0, 2]])
print(type(df.iloc[:, [0, 2]]))
#          age  point
# name               
# Alice     24     64
# Bob       20     92
# Charlie   30     70
# Dave      40     70
# Ellen     24     88
# Frank     30     57
# <class 'pandas.core.frame.DataFrame'>

ソートの方法

カラムを指定して(昇順、降順)
print(df.sort_values('name'))
#       name  age state  point
# 0    Alice   24    NY     64
# 1      Bob   42    CA     92
# 2  Charlie   18    CA     70
# 3     Dave   68    TX     70
# 4    Ellen   24    CA     88
# 5    Frank   30    NY     57

print(df.sort_values('name', ascending=False))
#       name  age state  point
# 5    Frank   30    NY     57
# 4    Ellen   24    CA     88
# 3     Dave   68    TX     70
# 2  Charlie   18    CA     70
# 1      Bob   42    CA     92
# 0    Alice   24    NY     64

 

キーでのソート

sort_index()
新しく特定カラムで並び替えをしてその順番でキーを振り直す場合

インデックスを振り直すにはreset_index()、不要になった基準列を削除するにはdrop()を使う。
print(df.sort_values('order').reset_index(drop=True).drop(columns='order'))
#       name  age state  point
# 0    Ellen   24    CA     88
# 1    Frank   30    NY     57
# 2  Charlie   18    CA     70
# 3    Alice   24    NY     64
# 4     Dave   68    TX     70
# 5      Bob   42    CA     92