【Pandas】行と列のデータを取得する方法 | loc／iloc

## 【はじめに】

データ加工やデータ分析、機械学習の領域においてはデータを操作することが多いです。

今回は、Pythonライブラリの「Pandas」の中でも、行と列のデータを取得する方法として、「loc」と「iloc」について使い方を紹介していきます。


### 本記事の内容

- pandasのインポート
- csvファイルの読み込み
- データ型を調べる
- 行数、列数を取得する
- 列を取得する
- 行と列を取得する:loc()
- 列を取得する:iloc()

## 【pandasのインポート】

```Python
import pandas as pd
```

## 【csvファイルの読み込み】

「1920年から2015年までの全国の人口推移のデータ」を使用します。
```Python
df = pd.read_csv('data.csv', encoding='shift-jis')
df
```

[![Image from Gyazo](https://i.gyazo.com/11406bae9050e6b1fb844661e903b40b.png)](https://gyazo.com/11406bae9050e6b1fb844661e903b40b)

私のGitHubに「nikkei.csv」としてアップロードしてあるので、下記コマンドでダウンロードすれば簡単に準備できます。

```
$ curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Pandas/data.csv -O
```

## 【データ型を調べる】

列ごとのデータ型を```dtypes```属性で調べることができます。

```Python
df.dtypes
```

```
都道府県コード      int64
都道府県名       object
元号          object
和暦（年）      float64
西暦（年）      float64
人口（総数）       int64
人口（男）        int64
人口（女）        int64
dtype: object
```

## 【行数、列数を取得する】

```shape```属性で行数と列数をまとめて取得することができます。

```Python
df.shape
```

```
# (行数, 列数)
(939, 8)
```

## 【列を取得する】

データフレームからカラム名を指定して、シリーズ（Series）として取得します。

```Python
series_population = df['人口（総数）']
series_population
```
```
0      2359183
1       756454
2       845540
3       961768
4       898537
        ...   
934    1786170
935    1166338
936    1104069
937    1648177
938    1433566
Name: 人口（総数）, Length: 939, dtype: int64
```

```Python
type(series_population)
```
```
pandas.core.series.Series
```

**ポイント**

- `df['カラム名']`でカラム名に対するデータを取得できます。
- 取得したデータを`type()`で確認すると、`Series`であることが確認できます。

```Python
df_population = df[['人口（総数）']]
df_population
```

[![Image from Gyazo](https://i.gyazo.com/7403ca875502eddef8f9a3fdc19e9b73.png)](https://gyazo.com/7403ca875502eddef8f9a3fdc19e9b73)

- 二重括弧[[]]でカラム名を指定することで、データフレームとして取得することができます。

```Python
type(df_population)
```
```
pandas.core.frame.DataFrame
```

```
df_population_by_gender = df[['人口（男）', '人口（女）']]
df_population_by_gender
```

[![Image from Gyazo](https://i.gyazo.com/7ebf9b779e8e33f82edd8c0c48d16367.png)](https://gyazo.com/7ebf9b779e8e33f82edd8c0c48d16367)

- 二重括弧内にコンマ続きでカラム名を指定すると、複数の列を取得することができます。


## 【行と列を取得する:loc()】

行や列のラベルを指定して値を取得します。

```Python
df.head(10)
```

[![Image from Gyazo](https://i.gyazo.com/34e0a0e239d230472ca0d0f335b6f466.png)](https://gyazo.com/34e0a0e239d230472ca0d0f335b6f466)

```Python
# dfの中から行のインデックスが「９」のデータ（都道府県が群馬）を取得する
df.loc[9]
```

```
都道府県コード         10
都道府県名          群馬県
元号              大正
和暦（年）          9.0
西暦（年）       1920.0
人口（総数）     1052610
人口（男）       514106
人口（女）       538504
Name: 9, dtype: object
```

**ポイント**

- `loc[]`の角括弧内には、行、列の順番で指定します。

```Python
# dfの中から行のインデックスが「9」、カラム名が「都道府県名」のデータを取得する
df.loc[9, '都道府県名']
```
```
'群馬県'
```

- `loc[]`を使用して列を取得することもできます。
- 行にコロンを指定すると「全ての行」を意味します。
- 列（カラム）の指定するときに角括弧内にコンマ続きでカラムを指定すると、複数の列を取得することができます。

```Python
df.loc[:, ['人口（総数）', '人口（男）', '人口（女）']]
```

[![Image from Gyazo](https://i.gyazo.com/274c5fbe4c6116a71a140138d70d8442.png)](https://gyazo.com/274c5fbe4c6116a71a140138d70d8442)

- 連続する複数の列（カラム）の値を取得する場合、取得したい両端のカラム名をコロンで繋ぐと同様に取得することができます。

```Python
df.loc[:, '人口（総数）':'人口（女）']
```
[![Image from Gyazo](https://i.gyazo.com/274c5fbe4c6116a71a140138d70d8442.png)](https://gyazo.com/274c5fbe4c6116a71a140138d70d8442)



## 【列を取得する:iloc()】

`iloc[]`を使用すると、列（カラム）を列番号で指定することができます。

```Python
# 人口（総数）の列番号は「5」、人口（女）の列番号は「7」のため、「5:8（7+1）」と列番号を指定する
df.iloc[:, 5:8]
```

[![Image from Gyazo](https://i.gyazo.com/274c5fbe4c6116a71a140138d70d8442.png)](https://gyazo.com/274c5fbe4c6116a71a140138d70d8442)

**ポイント**

- 列番号は「0」から始まります。
- 連続する複数の列（カラム）の値を取得する場合、カラム名の代わりに列番号をコンマで繋ぎます。
- ただし、コンマの後ろの列番号の手前までを取得するため、「+1」した列番号を指定します。
- 列番号を取得するには、`columns.get_loc()`を使用します。

```Python
df.columns.get_loc('人口（総数）')
```
```
5
```

## 【おわりに】

今回は、Pandasで行と列のデータを取得する方法として「loc」と「iloc」を紹介しました。

Pandasを使いこなすには練習あるのみです。

今回、使用したCSVファイルやJupyter NotebookはGitHubに公開しています。
Jupyter Notebookは下記コマンドでダウンロードできるので、自由に使って是非練習してみてください。

```
$ curl https://raw.githubusercontent.com/nakachan-ing/python-references/master/Pandas/pandasでデータを操作する.ipynb -O
```

https://github.com/nakachan-ing/python-references/tree/master/Pandas