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