Pandas: データフレームについて--08: 論理演算

# 論理演算 `all` と `any` と 排他論理和


```python
import pandas as pd

df = pd.DataFrame({
    'x': [1, 2, 3, 4, 5],
    'y': [1, 0, 0, 0, 1],
    'z': [0, 0, 0, 0, 1],
    'b': [True, False, True, True, True]})
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>x</th>
      <th>y</th>
      <th>z</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>1</td>
      <td>1</td>
      <td>0</td>
      <td>True</td>
    </tr>
    <tr>
      <th>1</th>
      <td>2</td>
      <td>0</td>
      <td>0</td>
      <td>False</td>
    </tr>
    <tr>
      <th>2</th>
      <td>3</td>
      <td>0</td>
      <td>0</td>
      <td>True</td>
    </tr>
    <tr>
      <th>3</th>
      <td>4</td>
      <td>0</td>
      <td>0</td>
      <td>True</td>
    </tr>
    <tr>
      <th>4</th>
      <td>5</td>
      <td>1</td>
      <td>1</td>
      <td>True</td>
    </tr>
  </tbody>
</table>
</div>



数値の場合，
`0`，`0.0` は `False`，それ以外なら `True`。


```python
bool(0.0), bool(0), bool(1), bool(123)
```




    (False, False, True, True)



文字列の場合，空文字列 `''` は `False`，それ以外なら `True`。


```python
bool(''), bool('False'), bool('123'), bool('0.0')
```




    (False, True, True, True)



## 1.　すべてが `True` か?

`all` は，すべての要素が `True` であるときに `True`。

    all(axis=0, bool_only=None, skipna=True, level=None, **kwargs)


```python
df.all() # axis=0 列ごと
```




    x     True
    y    False
    z    False
    b    False
    dtype: bool




```python
df.all(axis=1) # 行ごと
```




    0    False
    1    False
    2    False
    3    False
    4     True
    dtype: bool



論理値 `True`/`False` だけを含む行や列を対象にするときは，`bool_only=True` を指定する。


```python
df.all(bool_only=True) # axis=0 列ごと
```




    b    False
    dtype: bool



## 2.　どれかが `True` か?

`any` は，どれか 1 つの要素でも `True` であるときに `True`。

    any(axis=0, bool_only=None, skipna=True, level=None, **kwargs)


```python
df.any() # axis=0 列ごと
```




    x    True
    y    True
    z    True
    b    True
    dtype: bool




```python
df.any(axis=1) # 行ごと
```




    0    True
    1    True
    2    True
    3    True
    4    True
    dtype: bool



## 3.　`True` と `False` の反転


論理値の場合，`False` を `True`，`True` を `False` に反転する。

数値の場合， 0 を 1，1 を 0 に反転する。0，1 以外の数値は 2 進数表記のビットの 1 との 排他論理和したものを数値として読んだときの値[^1]になる。

[^1]: 例えば，　5 は 101<sub>(2)</sub> なので，001<sub>(2)</sub> との排他論理和をとると 100<sub>(2)</sub> = 4 になる。


```python
negate = df^1
negate
```




<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>x</th>
      <th>y</th>
      <th>z</th>
      <th>b</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th>0</th>
      <td>0</td>
      <td>0</td>
      <td>1</td>
      <td>False</td>
    </tr>
    <tr>
      <th>1</th>
      <td>3</td>
      <td>1</td>
      <td>1</td>
      <td>True</td>
    </tr>
    <tr>
      <th>2</th>
      <td>2</td>
      <td>1</td>
      <td>1</td>
      <td>False</td>
    </tr>
    <tr>
      <th>3</th>
      <td>5</td>
      <td>1</td>
      <td>1</td>
      <td>False</td>
    </tr>
    <tr>
      <th>4</th>
      <td>4</td>
      <td>0</td>
      <td>0</td>
      <td>False</td>
    </tr>
  </tbody>
</table>
</div>




```python
negate.all()
```




    x    False
    y    False
    z    False
    b    False
    dtype: bool




```python
negate.all(axis=1)
```




    0    False
    1     True
    2    False
    3    False
    4    False
    dtype: bool




```python
negate.any()
```




    x    True
    y    True
    z    True
    b    True
    dtype: bool




```python
negate.any(axis=1)
```




    0    True
    1    True
    2    True
    3    True
    4    True
    dtype: bool



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

    help(df.all) # Help on method all in module pandas.core.generic
    help(df.any) # Help on method any in module pandas.core.generic