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

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

##環境
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.以降しか使えないようです。
ちなみにバージョンは以下で確認可能です。

```python
import pandas as pd
print(pd.__version__)
```


##データ

```python
import pandas as pd
```

![スクリーンショット 2018-06-22 9.30.35.png](https://qiita-image-store.s3.amazonaws.com/0/256447/e2241ab1-b22b-a22d-76c0-f167f62bd5e2.png)

```python
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](https://qiita-image-store.s3.amazonaws.com/0/256447/63922a0b-e6ae-b6b6-5f41-1cdee3960ab4.png)

```python
# 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を指定して取り出す

```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/14e0b341-60a0-f02e-1f60-3d80dc356d5c.png)


```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/526aa475-b4a1-586e-9a7a-33ce0e9db783.png)

![スクリーンショット 2018-06-24 19.51.47.png](https://qiita-image-store.s3.amazonaws.com/0/256447/9e817d57-2e1e-97a7-30fe-6a06b0c63b40.png)



###一番最後の行を取り出す

```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/0f5d18b5-4fcf-96d4-1d1b-af967fd8c5e4.png)


```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/f13bfb2e-921f-0ba5-e4b4-bec82422d3c8.png)



###indexを複数指定して取り出す

```python
# 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](https://qiita-image-store.s3.amazonaws.com/0/256447/67a4ea0e-d7d1-4677-e16b-fb9eed251685.png)

![スクリーンショット 2018-06-24 18.42.41.png](https://qiita-image-store.s3.amazonaws.com/0/256447/141ca9ed-7529-c532-1e84-dc9ad1cc2484.png)


###indexに範囲を指定して取り出す

```python
# 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](https://qiita-image-store.s3.amazonaws.com/0/256447/4d0618e1-b39d-b67c-bbb0-793f700a8b85.png)

![スクリーンショット 2018-06-24 19.57.04.png](https://qiita-image-store.s3.amazonaws.com/0/256447/0d577ec6-211f-e69e-370c-1d3ee16e0b72.png)



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

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

![スクリーンショット 2018-06-22 10.42.40.png](https://qiita-image-store.s3.amazonaws.com/0/256447/a2809f3d-3034-d40b-f9b8-ffbb1a4f0d1f.png)

![スクリーンショット 2018-06-24 18.46.45.png](https://qiita-image-store.s3.amazonaws.com/0/256447/86842997-d4f1-b0fe-b2f5-481c0a943757.png)


###複数条件

```python
# 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](https://qiita-image-store.s3.amazonaws.com/0/256447/2b4ce4c4-a47a-1b01-ba4b-61b67fe15e15.png)

![スクリーンショット 2018-06-24 18.48.05.png](https://qiita-image-store.s3.amazonaws.com/0/256447/966a5d4d-7cc1-9659-f4a3-e6a37e68749b.png)


## column

###columnのid列を取り出す

```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/25f060d2-5a06-1fec-6758-bc656225e374.png)


```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/d07a7152-7a03-a42f-a08f-2d17100a571a.png)

###columnに範囲指定をして取り出す

```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/24c173bc-a5d7-b86c-3342-09b6920a2967.png)

![スクリーンショット 2018-06-24 18.56.45.png](https://qiita-image-store.s3.amazonaws.com/0/256447/497b9c0b-84d4-f90e-9998-51bb6a02422d.png)


###columnのid列とscore列を取り出す

```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/162a132d-b700-bbd0-16fb-02ba990c67ea.png)

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

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

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

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

![スクリーンショット 2018-06-22 9.41.38.png](https://qiita-image-store.s3.amazonaws.com/0/256447/d8997d7e-5665-325d-e57f-6370af86fb1f.png)

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

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

![スクリーンショット 2018-06-22 9.41.33.png](https://qiita-image-store.s3.amazonaws.com/0/256447/1156e443-513d-e874-a9e9-1be1aa637c53.png)

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

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

![スクリーンショット 2018-06-22 9.46.22.png](https://qiita-image-store.s3.amazonaws.com/0/256447/b644aa6a-5927-3e90-4e5c-7c96c318871d.png)

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

```python
# 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](https://qiita-image-store.s3.amazonaws.com/0/256447/d97416c3-11c0-f6b5-d2a4-9e72fd73cb83.png)

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

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

![スクリーンショット 2018-06-24 18.27.34.png](https://qiita-image-store.s3.amazonaws.com/0/256447/0e270c0d-2b66-8183-df89-931932748748.png)

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

```python
df[(df['id'] > 3) & (df['id'] < 6)]
#df2[(df2['id'] > 3) & (df2['id'] < 6)]
```
![スクリーンショット 2018-06-24 7.34.48.png](https://qiita-image-store.s3.amazonaws.com/0/256447/9fa59052-c63f-e14f-8ee3-2ab60d8b6740.png)

## indexとcolumn

###indexが0と2('n1'と'n3')、columnのid列を取り出す

```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/5113e076-2018-8e1f-7532-aedf4f84e499.png)

![スクリーンショット 2018-06-24 20.02.54.png](https://qiita-image-store.s3.amazonaws.com/0/256447/c8834895-5639-004d-3ca4-c5f152947603.png)


```python
# <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](https://qiita-image-store.s3.amazonaws.com/0/256447/b0d069f3-164d-6b55-408c-8507783afcd5.png)


![スクリーンショット 2018-06-24 20.03.22.png](https://qiita-image-store.s3.amazonaws.com/0/256447/5610317a-2aa5-a3a5-a955-630a1885deb2.png)

####Booleanで指定で取り出す

```python
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](https://qiita-image-store.s3.amazonaws.com/0/256447/9900d292-ac92-1b47-4d73-8e671a888fc0.png)

![スクリーンショット 2018-06-24 20.04.36.png](https://qiita-image-store.s3.amazonaws.com/0/256447/f48fc782-d7f0-1003-cc80-9336499d1a77.png)


###範囲指定

####indexが0から2('n1'から'n3')、columnが0番から1番（idとname）を取り出す

```python
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](https://qiita-image-store.s3.amazonaws.com/0/256447/732f98b6-7227-c41e-1fd5-ad523f27ea05.png)

![スクリーンショット 2018-06-24 20.06.02.png](https://qiita-image-store.s3.amazonaws.com/0/256447/8b700cf9-5ab5-2aee-e394-2aaf8a590bc6.png)



##最後に

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


##参考
[API Reference — pandas 0.23.1 documentation](https://pandas.pydata.org/pandas-docs/stable/api.html)
[Using iloc, loc, & ix to select rows and columns in Pandas DataFrames](https://www.shanelynn.ie/select-pandas-dataframe-rows-and-columns-using-iloc-loc-and-ix/)
[pandas の loc、iloc、ix の違い – python](http://ailaby.com/lox_iloc_ix/)