pandas.DataFrame.queryによるデータ抽出10選

# はじめに
この記事ではpandasの関数の1つであるqueryを用いた様々な条件抽出について紹介します。
筆者の経験の中で、データ前処理時に高頻度で遭遇する10つの例を元に実際のコードを記載します。

# 実行環境
- mac OS Mojave
- Python 3.7.3

```python
!python -V
```
    Python 3.7.3


# 使用モジュール
pandasのversionは1.0.3を使用します。
※version0.24.0以前のversionだとエラーが出る可能性あります。

```python
import pandas as pd  # 今回の主役
import numpy as np  # infやnanの値を生成するために使用
```

```python
# pandasのversion確認
print(pd.__version__)
```
    1.0.3


# データ準備

```python
# 今回使用するデータフレームの準備
df = pd.DataFrame({
        'a': range(1, 6),
        'b': range(10, 0, -2),
        'c c' : [1, 3, 5, 7, 9],
        'd' : [2, np.nan, np.inf, None, 10],
        'e' : ['a', 'b', 'c', 'd', 'e'],
        'f' : [False, True, True, False, True]})
```


```python
# データフレームの確認
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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>10</td>
      <td>1</td>
      <td>2.0</td>
      <td>a</td>
      <td>False</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>


# データ抽出10選
1. [1列での条件抽出](#1列での条件抽出)
2. [複数列での条件抽出](#複数列での条件抽出)
3. [カラム名にスペースを含む列の条件抽出](#カラム名にスペースを含む列の条件抽出)
4. [文字列指定による条件抽出](#文字列指定による条件抽出)
5. [複数条件による条件抽出](#複数条件による条件抽出)
6. [inf指定による条件抽出](#inf指定による条件抽出)
7. [欠損値指定による条件抽出](#欠損値指定による条件抽出)
8. [真偽値指定による条件抽出](#真偽値指定による条件抽出)
9. [リストを使用した条件抽出](#リストを使用した条件抽出)
10. [変数を使用した条件抽出](#変数を使用した条件抽出)

## 1列での条件抽出
データフレームの1列のみを使用した基本的な条件抽出。通常の比較演算子を使用可能。

```python
df.query('a == 3')  # 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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>


```python
df.query('a != 3')  # 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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>10</td>
      <td>1</td>
      <td>2.0</td>
      <td>a</td>
      <td>False</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

```python
df.query('a > 3')  # 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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>


## 複数列での条件抽出
複数列間の値を使用した条件抽出

```python
df.query('a > b')  # a列の値が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>a</th>
      <th>b</th>
      <th>c c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>



## カラム名にスペースを含む列の条件抽出
カラム名にスペースを含む場合はカラム名をバッククォート(\`)で囲む必要がある。
この機能はpandas 0.25.0で実装された機能なのでversion0.24.0以前ではエラーとなる。
https://pandas-docs.github.io/pandas-docs-travis/whatsnew/v0.25.0.html#other-enhancements

```python
df.query(' `c c` > b')  # c c列の値が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>a</th>
      <th>b</th>
      <th>c c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

## 文字列指定による条件抽出
条件を文字列で指定する場合は、値をダブルクォート(")で囲む必要がある。

```python
df.query('e == "a" ')  # e列の値が文字列"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>
      <th>b</th>
      <th>c c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>10</td>
      <td>1</td>
      <td>2.0</td>
      <td>a</td>
      <td>False</td>
    </tr>
  </tbody>
</table>
</div>


## 複数条件による条件抽出
複数の条件とandやorなどの論理演算子を用いた条件抽出。

```python
df.query('a > 2 and b < 3')  # a列の値が2より大きいかつb列の値が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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

```python
df.query('a > 2 or b < 3')  # a列の値が2より大きいあるいはb列の値が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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

```python
df.query('a > 2 or e == "d" ')  # a列の値が2より大きいあるいはe列の値が文字列"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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

```python
df.query(' 2<= a <= 4')  # a列の値が2以上4以下の範囲にある行を抽出
```

<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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
  </tbody>
</table>
</div>

## inf指定による条件抽出
値にinfを持つ場合は、以下のように抽出する。

```python
df.query(' d == inf')  # d列の値がinfである行を抽出
```

<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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

```python
df.query(' d != inf')  # d列の値がinfではない行を抽出
```

<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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>10</td>
      <td>1</td>
      <td>2.0</td>
      <td>a</td>
      <td>False</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

## 欠損値指定による条件抽出
値に欠損値を持つ場合は以下のように抽出する。

```python
df.query(' d != d')  # 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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
  </tbody>
</table>
</div>

```python
df.query(' d == d')  # 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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>10</td>
      <td>1</td>
      <td>2.0</td>
      <td>a</td>
      <td>False</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

## 真偽値指定による条件抽出
値にTrueやFalseなどの真偽値を持つ場合は以下のように抽出する。

```python
df.query('f == True')  # f列の値がTrueの行を抽出
```

<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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>


```python
df.query('f == False')  # f列の値がFalseの行を抽出
```

<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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>10</td>
      <td>1</td>
      <td>2.0</td>
      <td>a</td>
      <td>False</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
  </tbody>
</table>
</div>

## リストを使用した条件抽出
値がリストに入っているかどうかで条件抽出することが可能。

```python
df.query(' a in (1, 2, 3)')  # a列の値が(1, 2, 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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>10</td>
      <td>1</td>
      <td>2.0</td>
      <td>a</td>
      <td>False</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

```python
df.query(' a not in (1, 2, 3)')  # a列の値が(1, 2, 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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>2</td>
      <td>9</td>
      <td>10.0</td>
      <td>e</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>


## 変数を使用した条件抽出
条件の値として予め用意した変数を使用することが可能。

```python
x = 2  # 変数xに2を格納
df.query(' a == @x')  # a列の値がxである行を抽出
```

<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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>

```python
y = [2, 3, 4]  # 変数yにリストを格納
df.query('a in @y')  # a列の値がyのいずれかである行を抽出
```

<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 c</th>
      <th>d</th>
      <th>e</th>
      <th>f</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>8</td>
      <td>3</td>
      <td>NaN</td>
      <td>b</td>
      <td>True</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>6</td>
      <td>5</td>
      <td>inf</td>
      <td>c</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>4</td>
      <td>7</td>
      <td>NaN</td>
      <td>d</td>
      <td>False</td>
    </tr>
  </tbody>
</table>
</div>