値を取り出す方法色々あるなぁって思います。
この他にもまだまだあるかも。
環境
The version of the notebook server is: 5.4.0
Python 3.6.4 |Anaconda custom (64-bit)| [GCC 7.2.0]
Pandas 0.22.0
前置き
今回使うデータはdfとdf2です。
dfはカラム名だけを指定したもの、df2はそれに加えインデックスに名前(=行ラベル)を指定しました。
データを取り出す方法はloc, iloc, ixがあります。
それぞれ行、列の指定方法に違いがあり下記のようになります。
loc: 行ラベル、 列ラベル
iloc: 行の番号(0 ~ )、列の番号(0 ~ )
ix: 行ラベル、列ラベル または 行の番号(0 ~ )、列の番号(0 ~ )
こう見るとix最強感ありますが、pandasのversionが0.20.1.以降しか使えないようです。
ちなみにバージョンは以下で確認可能です。
import pandas as pd
print(pd.__version__)
データ
import pandas as pd
df = pd.DataFrame([
[1, 'Taro', 12],
[2, 'Yoshiko', 25],
[3, 'Hanako', 18],
[4, 'Santa', 25],
[5, 'Nobu', 16],
[6, 'Haruka', 29]],
columns=['id','name','score']
)
# indexに名前を指定しています
df2 = pd.DataFrame([
[1, 'Taro', 12],
[2, 'Yoshiko', 25],
[3, 'Hanako', 18],
[4, 'Santa', 25],
[5, 'Nobu', 16],
[6, 'Haruka', 29]],
index = ['n1', 'n2', 'n3', 'n4', 'n5', 'n6'],
columns=['id','name','score']
)
index
indexを指定して取り出す
# <class 'pandas.core.series.Series'>
df.loc[0]
# df2.loc[0]はエラー
df2.loc['n1']
df.iloc[0]
df2.iloc[0]
df.ix[0]
df2.ix[0]
df2.ix['n1']
# <class 'pandas.core.frame.DataFrame'>
df.loc[[0]]
# df2.loc[[0]]はエラー
df2.loc[['n1']]
df.iloc[[0]]
df2.iloc[[0]]
df.ix[[0]]
df2.ix[[0]]
df2.ix[['n1']]
df[df.index == 0]
df2[df2.index == 0]
df2[df2.index == 'n1']
一番最後の行を取り出す
# <class 'pandas.core.series.Series'>
# df.loc[-1]はエラー
# df2.loc[-1]はエラー
df.iloc[-1]
df2.iloc[-1]
# df.ix[-1]はエラー
df2.ix[-1]
# <class 'pandas.core.frame.DataFrame'>
# df.loc[[-1]]はエラー
# df2.loc[[-1]]はエラー
df.iloc[[-1]]
df2.iloc[[-1]]
# df.ix[[-1]]はエラーではないが正しくない値が戻る
df2.ix[[-1]]
indexを複数指定して取り出す
# pandas.core.frame.DataFrame
df.loc[[0,3,5]]
# df2.loc[[0,3,5]]はエラー
df2.loc[['n1', 'n2', 'n3']]
df.iloc[[0,3,5]]
df2.iloc[[0,3,5]]
df.ix[[0,3,5]]
df2.ix[[0,3,5]]
df2.ix[['n1', 'n2', 'n3']]
indexに範囲を指定して取り出す
# pandas.core.frame.DataFrame
df.loc[1:3]
df2.loc['n2':'n4']
df.iloc[1:4]
df2.iloc[1:4]
df.ix[1:3]
df2.ix[1:4]
df2.ix['n2':'n4']
indexに条件を指定して取り出す
# pandas.core.frame.DataFrame
df[df.index > 2]
df2[df2.index > 'n2']
複数条件
# pandas.core.frame.DataFrame
df[(df.index > 2) & (df.index < 5)]
df2[(df2.index > 'n3') & (df2.index < 'n6')]
column
columnのid列を取り出す
# <class 'pandas.core.series.Series'>
df.loc[:, 'id'] # df.loc[:, 0]はエラー
df2.loc[:, 'id']
df.iloc[:, 0] # df.iloc[:, 'id']はエラー
df2.iloc[:, 0]
df.ix[:, 'id']
df2.ix[:, 'id']
df.ix[:, 0]
df2.ix[:, 0]
# <class 'pandas.core.frame.DataFrame'>
df.loc[:, ['id']]
df2.loc[:, ['id']]
df.iloc[:, [0]]
df2.iloc[:, [0]]
df.ix[:, ['id']]
df2.ix[:, ['id']]
df.ix[:, [0]]
df2.ix[:, [0]]
columnに範囲指定をして取り出す
# <class 'pandas.core.frame.DataFrame'>
df.loc[:, 'id':'score']
df2.loc[:, 'id':'score']
df.iloc[:, 0:2]
df2.iloc[:, 0:2]
df.ix[:, 'id':'score']
df2.ix[:, 'id':'score']
df.ix[:, 0:2]
df2.ix[:, 0:2]
columnのid列とscore列を取り出す
# <class 'pandas.core.frame.DataFrame'>
df.loc[:, ['id', 'score']]
df2.loc[:, ['id', 'score']]
df.iloc[:, [0, 1]]
df2.iloc[:, [0, 1]]
df.ix[:, ['id', 'score']]
df2.ix[:, ['id', 'score']]
df.ix[:, [0, 1]]
df2.ix[:, [0, 1]]
columnに条件を指定して取り出す
※df2の結果は省略しています
idカラムが1のものを取り出す
df[df['id'] == 1]
#df2[df2['id'] == 1]
scoreカラムが25のものを取り出す
df[df['score'] == 25]
#df2[df2['score'] == 25]
idが3以上のものを取り出す
df[df['id'] > 3]
#df2[df2['id'] > 3]
scoreを倍にして40以上のものを取り出す
# applyとlambdaで式を書くことも可能
df.loc[df['score'].apply(lambda x: (x*2) > 40)]
#df2.loc[df2['score'].apply(lambda x: (x*2) > 40)]
nameの末尾がoのものを取り出す
df.loc[df['name'].str.endswith("o")]
#df2.loc[df2['name'].str.endswith("o")]
idカラムが3以上6以下のものを取り出す
df[(df['id'] > 3) & (df['id'] < 6)]
#df2[(df2['id'] > 3) & (df2['id'] < 6)]
indexとcolumn
indexが0と2('n1'と'n3')、columnのid列を取り出す
# <class 'pandas.core.series.Series'>
df.loc[[0, 2], 'id']
df2.loc[['n1', 'n3'], 'id']
df.iloc[[0, 2], 0]
df2.iloc[[0, 2], 0]
df.ix[[0, 2], 0]
df2.ix[[0, 2], 0]
df.ix[[0, 2], 'id']
df2.ix[[0, 2], 'id']
df2.ix[['n1', 'n3'], 'id']
# <class 'pandas.core.frame.DataFrame'>
df.loc[[0, 2], ['id']]
df2.loc[['n1', 'n3'], ['id']]
df.iloc[[0, 2], [0]]
df2.iloc[[0, 2], [0]]
df.ix[[0, 2], [0]]
df2.ix[[0, 2], [0]]
df.ix[[0, 2], ['id']]
df2.ix[[0, 2], ['id']]
df2.ix[['n1', 'n3'], ['id']]
Booleanで指定で取り出す
df.loc[[True, False, True], [True]]
df2.loc[[True, False, True], [True]]
df.iloc[[True, False, True], [True]]
df2.iloc[[True, False, True], [True]]
df.ix[[True, False, True], [True]]
df2.ix[[True, False, True], [True]]
範囲指定
indexが0から2('n1'から'n3')、columnが0番から1番(idとname)を取り出す
df.loc[0:2, 'id':'name']
df2.loc['n1':'n3', 'id':'name']
df.iloc[0:3, 0:2]
df2.iloc[0:3, 0:2]
df.ix[0:2, 'id':'name']
df.ix[0:2, 0:2]
df2.ix[0:3, 'id':'name']
df2.ix['n1':'n3', 'id':'name']
df2.ix['n1':'n3', 0:2]
df2.ix[0:3, 0:2]
最後に
色々ありますね。是非ご参考に。
参考
API Reference — pandas 0.23.1 documentation
Using iloc, loc, & ix to select rows and columns in Pandas DataFrames
pandas の loc、iloc、ix の違い – python