Pandas: データフレームについて--11: 重複データの処理

# 重複データの処理

列単位でユニークな値，行単位でユニークな行についての処理を行う。

```python
import pandas as pd
df = pd.DataFrame({
    'a': [4, 4, 1, 5, 1, 3, 4, 3, 5, 3, 3, 4, 3, 3, 5],
    'b': [4, 1, 4, 3, 1, 2, 4, 4, 2, 1, 1, 1, 1, 3, 3]
})
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>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>4</td>
      <td>4</td>
    </tr>
    <tr>
      <th>1</th>
      <td>4</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1</td>
      <td>4</td>
    </tr>
    <tr>
      <th>3</th>
      <td>5</td>
      <td>3</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>5</th>
      <td>3</td>
      <td>2</td>
    </tr>
    <tr>
      <th>6</th>
      <td>4</td>
      <td>4</td>
    </tr>
    <tr>
      <th>7</th>
      <td>3</td>
      <td>4</td>
    </tr>
    <tr>
      <th>8</th>
      <td>5</td>
      <td>2</td>
    </tr>
    <tr>
      <th>9</th>
      <td>3</td>
      <td>1</td>
    </tr>
    <tr>
      <th>10</th>
      <td>3</td>
      <td>1</td>
    </tr>
    <tr>
      <th>11</th>
      <td>4</td>
      <td>1</td>
    </tr>
    <tr>
      <th>12</th>
      <td>3</td>
      <td>1</td>
    </tr>
    <tr>
      <th>13</th>
      <td>3</td>
      <td>3</td>
    </tr>
    <tr>
      <th>14</th>
      <td>5</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>



# 1.　ユニーク値の個数　`nunique`

行，列で，ユニークな値の個数を求める。

    Usage: nunique(axis: 'Axis' = 0, dropna: 'bool' = True)



```python
df.nunique()
```




    a    4
    b    4
    dtype: int64



# 2.　ユニーク値とその頻度（度数分布） `value_counts`

データ中に出現するユニークな値の個数だけが知りたいということはあまりないと思われる。

`value_counts` は，ユニークな値とその出現頻度を集計する。統計学でいえば度数分布を求めるということである。

    Usage: value_counts(subset: 'Sequence[Hashable] | None' = None,
                        normalize: 'bool' = False, sort: 'bool' = True,
                        ascending: 'bool' = False, dropna: 'bool' = True)


```python
df['a'].value_counts()
```




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




```python
df['a'].value_counts(ascending=True)
```




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



クロス集計的なものもできる。


```python
df.value_counts(['a', 'b'])
```




    a  b
    3  1    3
    4  1    2
       4    2
    5  3    2
    1  1    1
       4    1
    3  2    1
       3    1
       4    1
    5  2    1
    dtype: int64



しかし，望まれるのは多分次項の `pd.crosstab()` であろう。

## 3.　クロス集計（二次元度数分布）

統計学でいう，クロス集計表を求める。

     Usage: crosstab(index, columns, values=None, rownames=None,
                     colnames=None, aggfunc=None, margins: 'bool' = False,
                     margins_name: 'str' = 'All', dropna: 'bool' = True,
                     normalize=False)


```python
pd.crosstab(df['a'], df['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>b</th>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>4</th>
    </tr>
    <tr>
      <th>a</th>
      <th></th>
      <th></th>
      <th></th>
      <th></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>1</th>
      <td>1</td>
      <td>0</td>
      <td>0</td>
      <td>1</td>
    </tr>
    <tr>
      <th>3</th>
      <td>3</td>
      <td>1</td>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>4</th>
      <td>2</td>
      <td>0</td>
      <td>0</td>
      <td>2</td>
    </tr>
    <tr>
      <th>5</th>
      <td>0</td>
      <td>1</td>
      <td>2</td>
      <td>0</td>
    </tr>
  </tbody>
</table>
</div>



## 4.　重複行の除去

行単位で同じ内容を持つ行を削除する。

    Usage: drop_duplicates(subset: 'Hashable | Sequence[Hashable] | None' = None,
                           keep: "Literal['first'] | Literal['last'] | Literal[False]" = 'first',
                           inplace: 'bool' = False, ignore_index: 'bool' = False)


```python
df.drop_duplicates()
```




<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>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>4</td>
      <td>4</td>
    </tr>
    <tr>
      <th>1</th>
      <td>4</td>
      <td>1</td>
    </tr>
    <tr>
      <th>2</th>
      <td>1</td>
      <td>4</td>
    </tr>
    <tr>
      <th>3</th>
      <td>5</td>
      <td>3</td>
    </tr>
    <tr>
      <th>4</th>
      <td>1</td>
      <td>1</td>
    </tr>
    <tr>
      <th>5</th>
      <td>3</td>
      <td>2</td>
    </tr>
    <tr>
      <th>7</th>
      <td>3</td>
      <td>4</td>
    </tr>
    <tr>
      <th>8</th>
      <td>5</td>
      <td>2</td>
    </tr>
    <tr>
      <th>9</th>
      <td>3</td>
      <td>1</td>
    </tr>
    <tr>
      <th>13</th>
      <td>3</td>
      <td>3</td>
    </tr>
  </tbody>
</table>
</div>



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

    help(df.nunique)         # Help on method value_counts in module pandas.core.frame
    help(df.value_counts)    # Help on method value_counts in module pandas.core.frame
    help(pd.crosstab)        # Help on function crosstab in module pandas.core.reshape.pivot
    help(df.drop_duplicates) # Help on method drop_duplicates in module pandas.core.frame