85
100

More than 5 years have passed since last update.

PandasのDataFrameから値を取り出す色んな方法

Posted at

値を取り出す方法色々あるなぁって思います。
この他にもまだまだあるかも。

環境

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

スクリーンショット 2018-06-22 9.30.35.png

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

スクリーンショット 2018-06-24 11.07.51.png

# 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']

スクリーンショット 2018-06-24 19.50.56.png

# <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']

スクリーンショット 2018-06-22 10.28.07.png

スクリーンショット 2018-06-24 19.51.47.png

一番最後の行を取り出す

# <class 'pandas.core.series.Series'>

# df.loc[-1]はエラー
# df2.loc[-1]はエラー

df.iloc[-1]
df2.iloc[-1]

# df.ix[-1]はエラー
df2.ix[-1]

スクリーンショット 2018-06-24 19.53.45.png

# <class 'pandas.core.frame.DataFrame'>

# df.loc[[-1]]はエラー
# df2.loc[[-1]]はエラー

df.iloc[[-1]]
df2.iloc[[-1]]

# df.ix[[-1]]はエラーではないが正しくない値が戻る
df2.ix[[-1]]

スクリーンショット 2018-06-24 10.55.22.png

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

スクリーンショット 2018-06-22 9.59.16.png

スクリーンショット 2018-06-24 18.42.41.png

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

スクリーンショット 2018-06-24 19.56.53.png

スクリーンショット 2018-06-24 19.57.04.png

indexに条件を指定して取り出す

# pandas.core.frame.DataFrame
df[df.index > 2]
df2[df2.index > 'n2']

スクリーンショット 2018-06-22 10.42.40.png

スクリーンショット 2018-06-24 18.46.45.png

複数条件

# pandas.core.frame.DataFrame
df[(df.index > 2) & (df.index < 5)]
df2[(df2.index > 'n3') & (df2.index < 'n6')]

スクリーンショット 2018-06-22 10.43.48.png

スクリーンショット 2018-06-24 18.48.05.png

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]

スクリーンショット 2018-06-24 10.18.56.png

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

スクリーンショット 2018-06-24 10.19.06.png

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]

スクリーンショット 2018-06-24 18.56.34.png

スクリーンショット 2018-06-24 18.56.45.png

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

スクリーンショット 2018-06-24 7.55.51.png

columnに条件を指定して取り出す

※df2の結果は省略しています

idカラムが1のものを取り出す

df[df['id'] == 1]
#df2[df2['id'] == 1]

スクリーンショット 2018-06-22 9.41.38.png

scoreカラムが25のものを取り出す

df[df['score'] == 25]
#df2[df2['score'] == 25]

スクリーンショット 2018-06-22 9.41.33.png

idが3以上のものを取り出す

df[df['id'] > 3]
#df2[df2['id'] > 3]

スクリーンショット 2018-06-22 9.46.22.png

scoreを倍にして40以上のものを取り出す

# applyとlambdaで式を書くことも可能
df.loc[df['score'].apply(lambda x: (x*2) > 40)] 
#df2.loc[df2['score'].apply(lambda x: (x*2) > 40)] 

スクリーンショット 2018-06-24 18.24.47.png

nameの末尾がoのものを取り出す

df.loc[df['name'].str.endswith("o")]
#df2.loc[df2['name'].str.endswith("o")]

スクリーンショット 2018-06-24 18.27.34.png

idカラムが3以上6以下のものを取り出す

df[(df['id'] > 3) & (df['id'] < 6)]
#df2[(df2['id'] > 3) & (df2['id'] < 6)]

スクリーンショット 2018-06-24 7.34.48.png

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

スクリーンショット 2018-06-24 10.16.46.png

スクリーンショット 2018-06-24 20.02.54.png

# <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']]

スクリーンショット 2018-06-24 20.03.54.png

スクリーンショット 2018-06-24 20.03.22.png

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

スクリーンショット 2018-06-24 10.14.41.png

スクリーンショット 2018-06-24 20.04.36.png

範囲指定

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]

スクリーンショット 2018-06-24 20.05.50.png

スクリーンショット 2018-06-24 20.06.02.png

最後に

色々ありますね。是非ご参考に。

参考

API Reference — pandas 0.23.1 documentation
Using iloc, loc, & ix to select rows and columns in Pandas DataFrames
pandas の loc、iloc、ix の違い – python

85
100
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
85
100