【python】pandasの活用～2回目：axisの使い方～

### はじめに

- バージョン
  - Python: 3.6.8
  - pandas: 1.1.5
- 概要 
  - pandasを理解する上で、axisの使い方を理解するのは重要なので以下の表を使って理解を深めます。

| - | a | b | c |
| --- | --- | --- | --- |
|0|1|2|3|
|1|4|5|6|
|2|7|8|9|

今回紹介するのは以下のパターンです。

- 1. 列 or 行ごとの最大値を抽出する
- 2. 行ごとの計算を行う
- 3. 関数を用いて行ごとの計算を行う   

### 1. 列 or 行ごとの最大値を抽出する

#### 1-1. 書き方

　表のデータを参照する際に、参照するデータが列ごとなのか、行なのかを指定する必要があります。
これに該当するパラメータがaxisです。**デフォルトがaxis=0で列ごとにデータを参照します**。
axis=1にすると行ごとにデータを参照します。書き方は以下です。

- 列ごとの最大値を抽出する
  - デフォルトがaxis=0なので記載不要

```text
DataFrame名.max()
```

- 行ごとの最大値を抽出する

```text
DataFrame名.max(axis=1)
```

#### 1-2. サンプルコード

　特筆すべき点はありませんが、axis=1は忘れがちなので注意しましょう。

```python:test_max.py
import pandas as pd


def main():

    df = pd.DataFrame(
        data=[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
        columns=["a", "b", "c"],
    )

    print("base DataFrame")
    print(df)
    print("")

    print("result: default(axis=0)")
    print(df.max())
    print("")

    print("result: axis=1")
    print(df.max(axis=1))


if __name__ == "__main__":
    main()

```

#### 1-3. 実行結果

　想定通り、列ごとと行ごとの最大値が抽出出来ました。

```text
base DataFrame
   a  b  c
0  1  2  3
1  4  5  6
2  7  8  9

result: default(axis=0)
a    7
b    8
c    9
dtype: int64

result: axis=1
0    3
1    6
2    9
dtype: int64
```

### 2. 行ごとの計算を行う

#### 2-1. 書き方

　ここでaxisの使い方はそこまで重要ではありませんが、まずは基本的な行ごとの計算を行います。
まず、DataFrameの列を抽出する場合は、以下のように記載します。

```text
DataFrame名[列名]
```

　今回はa列、b列、c列の合計値を計算するので、その結果を新しい列（result）に記載しましょう。

```text
df["result"] = df["a"] + df["b"] + df["c"]
```

　ちなみに、[sum](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sum.html)を使う場合は、maxを使う場合と同様に以下のように記載します。

```text
df["result"] = df.sum(axis=1)
```

#### 2-2. サンプルコード

```python:test_addition.py
import pandas as pd


def main():

    df = pd.DataFrame(
        data=[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
        columns=["a", "b", "c"],
    )

    df["result"] = df["a"] + df["b"] + df["c"]
    print(df)


if __name__ == "__main__":
    main()
```

#### 2-3. 実行結果

　想定通り、行ごとの合計値を計算することが出来ました。

```text
   a  b  c  result
0  1  2  3       6
1  4  5  6      15
2  7  8  9      24
```

### 3. 関数を用いて行ごとの計算を行う

#### 3-1. 書き方

　ここでは、行の合計値が10以上であるかを判定する関数を作成し、その結果を新たな列に
追加してみます。
まず、関数を適用する場合は、以下のように記載します。**行ごとの計算を行うのでaxis=1が必要**です。

```text
DataFrame名.apply(関数名, axis=1)
```

#### 3-2. サンプルコード

　今回は判定用の関数をcheck_sumとしました。機能としては、合計値が10以上であるかを判定し、
結果をTrue/Falseで返すようにしています。

```test_apply.py
import pandas as pd


def check_sum(data):

    return (data["a"] + data["b"] + data["c"]) >= 10


def main():

    df = pd.DataFrame(
        data=[[1, 2, 3], [4, 5, 6], [7, 8, 9]],
        columns=["a", "b", "c"],
    )

    df["result"] = df.apply(check_sum, axis=1)
    print(df)


if __name__ == "__main__":
    main()
```

#### 3-3. 実行結果

　想定通り、行ごとの合計値を判定することが出来ました。

```text
   a  b  c  result
0  1  2  3   False
1  4  5  6    True
2  7  8  9    True
```

### まとめ

　DataFrameで計算等を行う際は、参照するデータが列ごとなのか、行なのかを考えて
パラメータ（axis）を設定する必要があるそうです。pandasの使い方は、documentがあるので、
一度自分でも読んでみましょう。リンクは参考記事にまとめておきます。

### 参考記事

[pandas.DataFrame.max — pandas 1.3.2 documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.max.html)
[pandas.DataFrame.sum — pandas 1.3.2 documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sum.html)
[pandas.DataFrame.apply — pandas 1.3.2 documentation](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.apply.html)