Pandas: データフレームについて--03: 行，列の取り出し

# 行，列を取り出す

取り出した結果を保存するときには，データフレームに代入する。

## 1.　`filter()` を使う

データフレームの**内容によって取り出すのではなく**，列名，行インデックスを指定して取り出す。[^1]

[^1]: 内容によって取り出す場合は，「2.4.　条件式を使って指定」を参照。

filter(items=None, like: 'str | None' = None, regex: 'str | None' = None, axis=None)


```python
import pandas as pd
df = pd.DataFrame({
    'a': [1, 2, 3, 4, 5],
    'b': [1.2, 3.4, 5.6, 7.8, 9.0],
    'c': ['A', 'B', 'C', 'D', 'E']
})
df
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>1.2</td>
      <td>A</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>3.4</td>
      <td>B</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>5.6</td>
      <td>C</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>7.8</td>
      <td>D</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>9.0</td>
      <td>E</td>
    </tr>
  </tbody>
</table>
</div>



## 1.1.　列名を指定して列を取り出す

`filter(items=列名)`


```python

df.filter(items='a')
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>



複数列を指定できる。また，取り出す順序も指定できる。重複して指定することもできる。


```python
df.filter(items=['c', 'a', 'b', 'b'])
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>a</th>
      <th>b</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>1</td>
      <td>1.2</td>
      <td>1.2</td>
    </tr>
    <tr>
      <th>1</th>
      <td>B</td>
      <td>2</td>
      <td>3.4</td>
      <td>3.4</td>
    </tr>
    <tr>
      <th>2</th>
      <td>C</td>
      <td>3</td>
      <td>5.6</td>
      <td>5.6</td>
    </tr>
    <tr>
      <th>3</th>
      <td>D</td>
      <td>4</td>
      <td>7.8</td>
      <td>7.8</td>
    </tr>
    <tr>
      <th>4</th>
      <td>E</td>
      <td>5</td>
      <td>9.0</td>
      <td>9.0</td>
    </tr>
  </tbody>
</table>
</div>



## 1.2.　インデックスを指定して行を取り出す

`filter(like=インデックス, axis=0)`

`axis=0` を指定する。`axis` が 0 か 1 か，勘違いをしないために，`axis='index'` と指定するようにしておくと吉。

複数行を取り出す指定はできない（インデックスにリストは指定できない）ので，後述の `loc`，`iloc` アトリビュートを使う。


```python
df.filter(like='3', axis='index') # index が 3 のものを抽出
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>7.8</td>
      <td>D</td>
    </tr>
  </tbody>
</table>
</div>



## 2.　列名，行名，位置を指定する

### 2.1.　列名を指定


```python
df['a']
```




    0    1
    1    2
    2    3
    3    4
    4    5
    Name: a, dtype: int64



1 列だけを指定するときには `データフレーム.列名` でもよい。

なお，前の `df['a']` と同じく，この方法で取り出されるのはデータフレーム（pandas.core.frame.DataFrame）ではなく，シリーズ（pandas.core.series.Series）である。


```python
df.b
```




    0    1.2
    1    3.4
    2    5.6
    3    7.8
    4    9.0
    Name: b, dtype: float64



複数列を取り出すときには，リストで指定する（結果はデータフレームである）。重複して指定することもできる。


```python
df[['c', 'a', 'a']]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>a</th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>B</td>
      <td>2</td>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>C</td>
      <td>3</td>
      <td>3</td>
    </tr>
    <tr>
      <th>3</th>
      <td>D</td>
      <td>4</td>
      <td>4</td>
    </tr>
    <tr>
      <th>4</th>
      <td>E</td>
      <td>5</td>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>



### 2.2.　`loc` アトリビュートを使って指定


```python
df.loc[:, 'a']
```




    0    1
    1    2
    2    3
    3    4
    4    5
    Name: a, dtype: int64




```python
df.loc[:, ['c', 'a']]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>1</td>
    </tr>
    <tr>
      <th>1</th>
      <td>B</td>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>C</td>
      <td>3</td>
    </tr>
    <tr>
      <th>3</th>
      <td>D</td>
      <td>4</td>
    </tr>
    <tr>
      <th>4</th>
      <td>E</td>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>



`loc` アトリビュートを使うときには，取り出す行も同時に指定できる。

なお，`1:3` のように指定したとき，**3 も含まれる**ので注意。


```python
df.loc[1:3, ['c', 'a']]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>B</td>
      <td>2</td>
    </tr>
    <tr>
      <th>2</th>
      <td>C</td>
      <td>3</td>
    </tr>
    <tr>
      <th>3</th>
      <td>D</td>
      <td>4</td>
    </tr>
  </tbody>
</table>
</div>



### 2.3.　`iloc` アトリビュートを使って指定


```python
df.iloc[[0, 2, 4], [2, 0]]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>c</th>
      <th>a</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>A</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>C</td>
      <td>3</td>
    </tr>
    <tr>
      <th>4</th>
      <td>E</td>
      <td>5</td>
    </tr>
  </tbody>
</table>
</div>



### 2.4.　条件式を使って指定



```python
df[df.a > 3]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>7.8</td>
      <td>D</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>9.0</td>
      <td>E</td>
    </tr>
  </tbody>
</table>
</div>




```python
df[df['c'].isin(['A', 'D'])]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>1.2</td>
      <td>A</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>7.8</td>
      <td>D</td>
    </tr>
  </tbody>
</table>
</div>



条件式の論理和，論理積をとるとき，それぞれの条件式はカッコで括ること。


```python
df[(df.a > 3) | (df.a < 2)]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>1.2</td>
      <td>A</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>7.8</td>
      <td>D</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>9.0</td>
      <td>E</td>
    </tr>
  </tbody>
</table>
</div>




```python
df[(df.a > 3) & (df.b > 8)]
```




<div>
<style scoped>
    .dataframe tbody tr th:only-of-type {
        vertical-align: middle;
    }

    .dataframe tbody tr th {
        vertical-align: top;
    }

    .dataframe thead th {
        text-align: right;
    }
</style>
<table border="1" class="dataframe">
  <thead>
    <tr style="text-align: right;">
      <th></th>
      <th>a</th>
      <th>b</th>
      <th>c</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>9.0</td>
      <td>E</td>
    </tr>
  </tbody>
</table>
</div>



## 3.　もっと知りたい人

```
help(df.filter) # Help on method filter in module pandas.core.generic
help(df.loc)    # Help on _LocIndexer in module pandas.core.indexing object
help(df.iloc)   # Help on _iLocIndexer in module pandas.core.indexing object
```