Python DataFrame メソッドについて覚え書き

# 初めに
今後使いそうなメソッドのまとめ。

- pandas バージョン
  - 1.0.5

前回と同様最高気温の月平均を用いる。

https://www.data.jma.go.jp/obd/stats/etrn/view/monthly_s3.php?prec_no=44&block_no=47662&year=2020&month=&day=&view=a2

```max_temperature.csv
年,1月,2月,3月,4月,5月,6月,7月,8月,9月,10月,11月,12月,年の値
1876,6.6,8.2,13.6,17.5,21.7,22.8,28.6,31.6,26.8,20.4,15.8,11.0,18.7
1877,8.8,8.8,11.3,19.1,21.5,26.0,31.0,30.5,25.8,21.3,14.4,10.2,19.1
1878,7.2,7.1,12.9,16.2,22.7,24.1,29.8,28.5,26.3,20.2,14.1,10.9,18.3
1879,9.0,10.9,13.0,17.1,21.9,25.2,30.4,31.1,25.4,19.4,15.7,14.0,19.4
1880,8.8,10.1,13.8,16.7,22.6,23.9,28.0,29.5,27.0,21.6,16.8,11.1,19.2
・・・
```

```py
import pandas as pd

df = pd.read_csv('max_temperature.csv', index_col='年')
print(df)
```

```
        1月    2月    3月    4月    5月    6月    7月    8月    9月   10月   11月   12月   年の値
年
1876   6.6   8.2  13.6  17.5  21.7  22.8  28.6  31.6  26.8  20.4  15.8  11.0  18.7
1877   8.8   8.8  11.3  19.1  21.5  26.0  31.0  30.5  25.8  21.3  14.4  10.2  19.1
1878   7.2   7.1  12.9  16.2  22.7  24.1  29.8  28.5  26.3  20.2  14.1  10.9  18.3
1879   9.0  10.9  13.0  17.1  21.9  25.2  30.4  31.1  25.4  19.4  15.7  14.0  19.4
1880   8.8  10.1  13.8  16.7  22.6  23.9  28.0  29.5  27.0  21.6  16.8  11.1  19.2
...    ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...
2016  10.6  12.2  14.9  20.3  25.2  26.3  29.7  31.6  27.7  22.6  15.5  13.8  20.9
2017  10.8  12.1  13.4  19.9  25.1  26.4  31.8  30.4  26.8  20.1  16.6  11.1  20.4
2018   9.4  10.1  16.9  22.1  24.6  26.6  32.7  32.5  26.6  23.0  17.7  12.1  21.2
2019  10.3  11.6  15.4  19.0  25.3  25.8  27.5  32.8  29.4  23.3  17.7  12.6  20.9
2020  11.1  13.3  16.0  18.2  24.0  27.5  27.7  34.1  28.1  21.4  18.6  12.3  21.0

[145 rows x 13 columns]
```

# メソッド

### add

```py
print(df + 1000)
```

```
          1月      2月      3月      4月      5月      6月      7月      8月      9月     10月     11月     12月     年の値
年
1876  1006.6  1008.2  1013.6  1017.5  1021.7  1022.8  1028.6  1031.6  1026.8  1020.4  1015.8  1011.0  1018.7
1877  1008.8  1008.8  1011.3  1019.1  1021.5  1026.0  1031.0  1030.5  1025.8  1021.3  1014.4  1010.2  1019.1
1878  1007.2  1007.1  1012.9  1016.2  1022.7  1024.1  1029.8  1028.5  1026.3  1020.2  1014.1  1010.9  1018.3
1879  1009.0  1010.9  1013.0  1017.1  1021.9  1025.2  1030.4  1031.1  1025.4  1019.4  1015.7  1014.0  1019.4
1880  1008.8  1010.1  1013.8  1016.7  1022.6  1023.9  1028.0  1029.5  1027.0  1021.6  1016.8  1011.1  1019.2
...      ...     ...     ...     ...     ...     ...     ...     ...     ...     ...     ...     ...     ...
2016  1010.6  1012.2  1014.9  1020.3  1025.2  1026.3  1029.7  1031.6  1027.7  1022.6  1015.5  1013.8  1020.9
2017  1010.8  1012.1  1013.4  1019.9  1025.1  1026.4  1031.8  1030.4  1026.8  1020.1  1016.6  1011.1  1020.4
2018  1009.4  1010.1  1016.9  1022.1  1024.6  1026.6  1032.7  1032.5  1026.6  1023.0  1017.7  1012.1  1021.2
2019  1010.3  1011.6  1015.4  1019.0  1025.3  1025.8  1027.5  1032.8  1029.4  1023.3  1017.7  1012.6  1020.9
2020  1011.1  1013.3  1016.0  1018.2  1024.0  1027.5  1027.7  1034.1  1028.1  1021.4  1018.6  1012.3  1021.0

[145 rows x 13 columns]
```

### add_prefix

>シリーズの場合、行名には接頭辞が付きます。DataFrameの場合、列名には接頭辞が付きます。

```py
print('type(df.dtypes): {}\n'.format(type(df.dtypes)))

# シリーズの場合行ラベルに接頭辞が追加される
print(df.dtypes.add_prefix('列: '))
```

```
type(df.dtypes): <class 'pandas.core.series.Series'>

列: 1月     float64
列: 2月     float64
列: 3月     float64
列: 4月     float64
列: 5月     float64
列: 6月     float64
列: 7月     float64
列: 8月     float64
列: 9月     float64
列: 10月    float64
列: 11月    float64
列: 12月    float64
列: 年の値    float64
dtype: object
```

```py
# DataFrameの場合列名に接頭辞が追加される
print(df.add_prefix('列: '))
```

```
      列: 1月  列: 2月  列: 3月  列: 4月  列: 5月  列: 6月  列: 7月  列: 8月  列: 9月  列: 10月  列: 11月  列: 12月  列: 年の値
年
1876    6.6    8.2   13.6   17.5   21.7   22.8   28.6   31.6   26.8    20.4    15.8    11.0    18.7
1877    8.8    8.8   11.3   19.1   21.5   26.0   31.0   30.5   25.8    21.3    14.4    10.2    19.1
1878    7.2    7.1   12.9   16.2   22.7   24.1   29.8   28.5   26.3    20.2    14.1    10.9    18.3
1879    9.0   10.9   13.0   17.1   21.9   25.2   30.4   31.1   25.4    19.4    15.7    14.0    19.4
1880    8.8   10.1   13.8   16.7   22.6   23.9   28.0   29.5   27.0    21.6    16.8    11.1    19.2
...     ...    ...    ...    ...    ...    ...    ...    ...    ...     ...     ...     ...     ...
2016   10.6   12.2   14.9   20.3   25.2   26.3   29.7   31.6   27.7    22.6    15.5    13.8    20.9
2017   10.8   12.1   13.4   19.9   25.1   26.4   31.8   30.4   26.8    20.1    16.6    11.1    20.4
2018    9.4   10.1   16.9   22.1   24.6   26.6   32.7   32.5   26.6    23.0    17.7    12.1    21.2
2019   10.3   11.6   15.4   19.0   25.3   25.8   27.5   32.8   29.4    23.3    17.7    12.6    20.9
2020   11.1   13.3   16.0   18.2   24.0   27.5   27.7   34.1   28.1    21.4    18.6    12.3    21.0

[145 rows x 13 columns]
```

```py
# インデックスの更新
df.index = ['西暦' + str(i) + '年' for i in range(1876, 2021)]
print(df)
```

```
           1月    2月    3月    4月    5月    6月    7月    8月    9月   10月   11月   12月   年の値
西暦1876年   6.6   8.2  13.6  17.5  21.7  22.8  28.6  31.6  26.8  20.4  15.8  11.0  18.7
西暦1877年   8.8   8.8  11.3  19.1  21.5  26.0  31.0  30.5  25.8  21.3  14.4  10.2  19.1
西暦1878年   7.2   7.1  12.9  16.2  22.7  24.1  29.8  28.5  26.3  20.2  14.1  10.9  18.3
西暦1879年   9.0  10.9  13.0  17.1  21.9  25.2  30.4  31.1  25.4  19.4  15.7  14.0  19.4
西暦1880年   8.8  10.1  13.8  16.7  22.6  23.9  28.0  29.5  27.0  21.6  16.8  11.1  19.2
...       ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...
西暦2016年  10.6  12.2  14.9  20.3  25.2  26.3  29.7  31.6  27.7  22.6  15.5  13.8  20.9
西暦2017年  10.8  12.1  13.4  19.9  25.1  26.4  31.8  30.4  26.8  20.1  16.6  11.1  20.4
西暦2018年   9.4  10.1  16.9  22.1  24.6  26.6  32.7  32.5  26.6  23.0  17.7  12.1  21.2
西暦2019年  10.3  11.6  15.4  19.0  25.3  25.8  27.5  32.8  29.4  23.3  17.7  12.6  20.9
西暦2020年  11.1  13.3  16.0  18.2  24.0  27.5  27.7  34.1  28.1  21.4  18.6  12.3  21.0

[145 rows x 13 columns]
```


### apply

>axis{0 or ‘index’, 1 or ‘columns’}, default 0

>0 または 'index' : 各列に関数を適用します。
1 または 'columns'：各行に関数を適用します。


```py
# 各列に対して和を計算する
print(df.apply(np.sum, axis=0))
```

```
1月     1313.3
2月     1381.6
3月     1835.3
4月     2620.0
5月     3220.4
6月     3636.9
7月     4195.4
8月     4432.5
9月     3863.9
10月    3061.9
11月    2358.0
12月    1674.2
年の値    2800.2
dtype: float64
```

```py
# 各行に対して和を計算する
print(df.apply(np.sum, axis=1))
```

```
年
1876    243.3
1877    247.8
1878    238.3
1879    252.5
1880    249.1
        ...
2016    271.3
2017    264.9
2018    275.5
2019    271.6
2020    273.3
Length: 145, dtype: float64
```

```py
# 各要素に対して平方根をとる
print(df.apply(np.sqrt))
```

```
            1月        2月        3月        4月        5月        6月        7月        8月        9月       10月       11月       12月       年の値
年
1876  2.569047  2.863564  3.687818  4.183300  4.658326  4.774935  5.347897  5.621388  5.176872  4.516636  3.974921  3.316625  4.324350
1877  2.966479  2.966479  3.361547  4.370355  4.636809  5.099020  5.567764  5.522681  5.079370  4.615192  3.794733  3.193744  4.370355
1878  2.683282  2.664583  3.591657  4.024922  4.764452  4.909175  5.458938  5.338539  5.128353  4.494441  3.754997  3.301515  4.277850
1879  3.000000  3.301515  3.605551  4.135215  4.679744  5.019960  5.513620  5.576737  5.039841  4.404543  3.962323  3.741657  4.404543
1880  2.966479  3.178050  3.714835  4.086563  4.753946  4.888763  5.291503  5.431390  5.196152  4.647580  4.098780  3.331666  4.381780
...        ...       ...       ...       ...       ...       ...       ...       ...       ...       ...       ...       ...       ...
2016  3.255764  3.492850  3.860052  4.505552  5.019960  5.128353  5.449771  5.621388  5.263079  4.753946  3.937004  3.714835  4.571652
2017  3.286335  3.478505  3.660601  4.460942  5.009990  5.138093  5.639149  5.513620  5.176872  4.483302  4.074310  3.331666  4.516636
2018  3.065942  3.178050  4.110961  4.701064  4.959839  5.157519  5.718391  5.700877  5.157519  4.795832  4.207137  3.478505  4.604346
2019  3.209361  3.405877  3.924283  4.358899  5.029911  5.079370  5.244044  5.727128  5.422177  4.827007  4.207137  3.549648  4.571652
2020  3.331666  3.646917  4.000000  4.266146  4.898979  5.244044  5.263079  5.839521  5.300943  4.626013  4.312772  3.507136  4.582576

[145 rows x 13 columns]
```



### agg

>指定された軸上で1つ以上の操作を使用して集計します。



```py
# 列ごとに和を計算、最小値を取得
print(df.agg(['sum', 'min']))
```

```
         1月      2月      3月      4月      5月      6月      7月      8月      9月     10月     11月     12月     年の値
sum  1313.3  1381.6  1835.3  2620.0  3220.4  3636.9  4195.4  4432.5  3863.9  3061.9  2358.0  1674.2  2800.2
min     5.5     5.8     9.6    14.8    19.2    21.6    25.1    25.7    23.2    18.5    12.9     8.7    17.5
```

```py
# "1 月" 列と "2 月" 列で異なる処理をする
# "1 月" 列では max 処理をしていないので NaN の値が表示される
print(df.agg({'1月': ['sum', 'min'], '2月': ['min', 'max'], '3月': ['mean']}))
```

```
          1月    2月         3月
max      NaN  13.3        NaN
mean     NaN   NaN  12.657241
min      5.5   5.8        NaN
sum   1313.3   NaN        NaN
```

```py
# axis="columns" は行ごとに、各列の値の処理をする
# axis=1でも同じ結果を得る
df.agg("mean", axis="columns")
```

```
年
1876    18.715385
1877    19.061538
1878    18.330769
1879    19.423077
1880    19.161538
          ...
2016    20.869231
2017    20.376923
2018    21.192308
2019    20.892308
2020    21.023077
Length: 145, dtype: float64
```

### assign

>DataFrameに新しい列を割り当てます。

```py
# すべての行、インデックス 0 からインデックス 11 までの列( 1 月 ～ 12 月 )を抽出し、各行に対して和を計算する
# その和を "SUM" という新たな列として割り当てる
df = df.assign(SUM=df.iloc[:, 0:12].apply(np.sum, axis=1))
print('add column "SUM":\n{}\n'.format(df))
```

```
add column "SUM":
        1月    2月    3月    4月    5月    6月    7月    8月    9月   10月   11月   12月   年の値    SUM
年
1876   6.6   8.2  13.6  17.5  21.7  22.8  28.6  31.6  26.8  20.4  15.8  11.0  18.7  224.6
1877   8.8   8.8  11.3  19.1  21.5  26.0  31.0  30.5  25.8  21.3  14.4  10.2  19.1  228.7
1878   7.2   7.1  12.9  16.2  22.7  24.1  29.8  28.5  26.3  20.2  14.1  10.9  18.3  220.0
1879   9.0  10.9  13.0  17.1  21.9  25.2  30.4  31.1  25.4  19.4  15.7  14.0  19.4  233.1
1880   8.8  10.1  13.8  16.7  22.6  23.9  28.0  29.5  27.0  21.6  16.8  11.1  19.2  229.9
...    ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...    ...
2016  10.6  12.2  14.9  20.3  25.2  26.3  29.7  31.6  27.7  22.6  15.5  13.8  20.9  250.4
2017  10.8  12.1  13.4  19.9  25.1  26.4  31.8  30.4  26.8  20.1  16.6  11.1  20.4  244.5
2018   9.4  10.1  16.9  22.1  24.6  26.6  32.7  32.5  26.6  23.0  17.7  12.1  21.2  254.3
2019  10.3  11.6  15.4  19.0  25.3  25.8  27.5  32.8  29.4  23.3  17.7  12.6  20.9  250.7
2020  11.1  13.3  16.0  18.2  24.0  27.5  27.7  34.1  28.1  21.4  18.6  12.3  21.0  252.3

[145 rows x 14 columns]
```

```py
# 各行の "SUM" 列の値に対し 12 で割った値を新たに "MEAN" 列として割り当てる
df = df.assign(MEAN=df['SUM'] / 12)
print('add column "MEAN":\n{}\n'.format(df))
```

```
add column "MEAN":
        1月    2月    3月    4月    5月    6月    7月    8月    9月   10月   11月   12月   年の値    SUM       MEAN
年
1876   6.6   8.2  13.6  17.5  21.7  22.8  28.6  31.6  26.8  20.4  15.8  11.0  18.7  224.6  18.716667
1877   8.8   8.8  11.3  19.1  21.5  26.0  31.0  30.5  25.8  21.3  14.4  10.2  19.1  228.7  19.058333
1878   7.2   7.1  12.9  16.2  22.7  24.1  29.8  28.5  26.3  20.2  14.1  10.9  18.3  220.0  18.333333
1879   9.0  10.9  13.0  17.1  21.9  25.2  30.4  31.1  25.4  19.4  15.7  14.0  19.4  233.1  19.425000
1880   8.8  10.1  13.8  16.7  22.6  23.9  28.0  29.5  27.0  21.6  16.8  11.1  19.2  229.9  19.158333
...    ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...    ...        ...
2016  10.6  12.2  14.9  20.3  25.2  26.3  29.7  31.6  27.7  22.6  15.5  13.8  20.9  250.4  20.866667
2017  10.8  12.1  13.4  19.9  25.1  26.4  31.8  30.4  26.8  20.1  16.6  11.1  20.4  244.5  20.375000
2018   9.4  10.1  16.9  22.1  24.6  26.6  32.7  32.5  26.6  23.0  17.7  12.1  21.2  254.3  21.191667
2019  10.3  11.6  15.4  19.0  25.3  25.8  27.5  32.8  29.4  23.3  17.7  12.6  20.9  250.7  20.891667
2020  11.1  13.3  16.0  18.2  24.0  27.5  27.7  34.1  28.1  21.4  18.6  12.3  21.0  252.3  21.025000

[145 rows x 15 columns]
```

```py
# 各行(axis=1)の中央値を新たに "MEDIAN" 列として割り当てる
df = df.assign(MEDIAN=df.iloc[:, 0:12].median(axis=1))
print('add column "MEDIAN":\n{}\n'.format(df))
```

```
add column "MEDIAN":
        1月    2月    3月    4月    5月    6月    7月    8月    9月   10月   11月   12月   年の値    SUM       MEAN  MEDIAN
年
1876   6.6   8.2  13.6  17.5  21.7  22.8  28.6  31.6  26.8  20.4  15.8  11.0  18.7  224.6  18.716667   18.95
1877   8.8   8.8  11.3  19.1  21.5  26.0  31.0  30.5  25.8  21.3  14.4  10.2  19.1  228.7  19.058333   20.20
1878   7.2   7.1  12.9  16.2  22.7  24.1  29.8  28.5  26.3  20.2  14.1  10.9  18.3  220.0  18.333333   18.20
1879   9.0  10.9  13.0  17.1  21.9  25.2  30.4  31.1  25.4  19.4  15.7  14.0  19.4  233.1  19.425000   18.25
1880   8.8  10.1  13.8  16.7  22.6  23.9  28.0  29.5  27.0  21.6  16.8  11.1  19.2  229.9  19.158333   19.20
...    ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...    ...        ...     ...
2016  10.6  12.2  14.9  20.3  25.2  26.3  29.7  31.6  27.7  22.6  15.5  13.8  20.9  250.4  20.866667   21.45
2017  10.8  12.1  13.4  19.9  25.1  26.4  31.8  30.4  26.8  20.1  16.6  11.1  20.4  244.5  20.375000   20.00
2018   9.4  10.1  16.9  22.1  24.6  26.6  32.7  32.5  26.6  23.0  17.7  12.1  21.2  254.3  21.191667   22.55
2019  10.3  11.6  15.4  19.0  25.3  25.8  27.5  32.8  29.4  23.3  17.7  12.6  20.9  250.7  20.891667   21.15
2020  11.1  13.3  16.0  18.2  24.0  27.5  27.7  34.1  28.1  21.4  18.6  12.3  21.0  252.3  21.025000   20.00
```

### count

>各列または行について、NA以外のセルをカウントします。

```py
# 1876 年 1 月 を NaN という値に更新する
df.loc[1876, '1月'] = np.nan

# 1876 年以降 2 月のすべての値を NaN という値に更新する
df.loc[df.index > 1875, '2月'] = np.nan
print('df:\n{}\n'.format(df))
```

```
df:
        1月  2月    3月    4月    5月    6月    7月    8月    9月   10月   11月   12月   年の値
年
1876   NaN NaN  13.6  17.5  21.7  22.8  28.6  31.6  26.8  20.4  15.8  11.0  18.7
1877   8.8 NaN  11.3  19.1  21.5  26.0  31.0  30.5  25.8  21.3  14.4  10.2  19.1
1878   7.2 NaN  12.9  16.2  22.7  24.1  29.8  28.5  26.3  20.2  14.1  10.9  18.3
1879   9.0 NaN  13.0  17.1  21.9  25.2  30.4  31.1  25.4  19.4  15.7  14.0  19.4
1880   8.8 NaN  13.8  16.7  22.6  23.9  28.0  29.5  27.0  21.6  16.8  11.1  19.2
...    ...  ..   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...   ...
2016  10.6 NaN  14.9  20.3  25.2  26.3  29.7  31.6  27.7  22.6  15.5  13.8  20.9
2017  10.8 NaN  13.4  19.9  25.1  26.4  31.8  30.4  26.8  20.1  16.6  11.1  20.4
2018   9.4 NaN  16.9  22.1  24.6  26.6  32.7  32.5  26.6  23.0  17.7  12.1  21.2
2019  10.3 NaN  15.4  19.0  25.3  25.8  27.5  32.8  29.4  23.3  17.7  12.6  20.9
2020  11.1 NaN  16.0  18.2  24.0  27.5  27.7  34.1  28.1  21.4  18.6  12.3  21.0

[145 rows x 13 columns]
```

```py
# 列ごとに、各行に含まれる NaN 以外の要素の個数をカウント
print('df.count():\n{}\n'.format(df.count()))
```

```
df.count():
1月     144
2月       0
3月     145
4月     145
5月     145
6月     145
7月     145
8月     145
9月     145
10月    145
11月    145
12月    145
年の値    145
dtype: int64
```

```py
# 行ごとに、各列に含まれる NaN 以外の要素の個数をカウント
print("df.count(axis='columns'):\n{}\n".format(df.count(axis='columns')))
```

```
df.count(axis='columns'):
年
1876    11
1877    12
1878    12
1879    12
1880    12
        ..
2016    12
2017    12
2018    12
2019    12
2020    12
Length: 145, dtype: int64
```

### describe

>記述統計を生成します。
記述統計には、NaN値を除いて、データセットの分布の中心傾向、分散、および形状を要約した統計が含まれます。

```py
students = ['一郎', '二郎', '三郎']
japanese = [59, 60, 45]
mathmatics = [48, 30, 47]
science = [10, 37, 40]
social = [60, 57, 22]
df = pd.DataFrame({'国語': japanese, '算数': mathmatics,
                    '理科': science, '社会': social},
                  index=students)
print(df)
df.describe()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/8ec18646-5eb7-9783-5bb8-8ccfacee3b60.png)


### filter

>指定されたインデックスラベルに従って、行または列を抽出します。

```py
print(df.filter(items=['1月', '12月'], axis=1))
```

```
        1月   12月
年
1876   6.6  11.0
1877   8.8  10.2
1878   7.2  10.9
1879   9.0  14.0
1880   8.8  11.1
...    ...   ...
2016  10.6  13.8
2017  10.8  11.1
2018   9.4  12.1
2019  10.3  12.6
2020  11.1  12.3

[145 rows x 2 columns]
```

```py
# 正規表現を使い、4 月 ～ 6 月の列を抽出
print(df.filter(regex='^[4-6]', axis=1))
```

```
        4月    5月    6月
年
1876  17.5  21.7  22.8
1877  19.1  21.5  26.0
1878  16.2  22.7  24.1
1879  17.1  21.9  25.2
1880  16.7  22.6  23.9
...    ...   ...   ...
2016  20.3  25.2  26.3
2017  19.9  25.1  26.4
2018  22.1  24.6  26.6
2019  19.0  25.3  25.8
2020  18.2  24.0  27.5

[145 rows x 3 columns]
```

```py
# 西暦に "88" が並ぶ行であり、かつ 4 月 ～ 6 月の列を抽出
print(df.filter(like='88', axis=0).filter(regex='^[4-6]', axis=1))
```

```
        4月    5月    6月
年
1880  16.7  22.6  23.9
1881  16.9  22.5  25.6
1882  18.4  21.9  24.0
1883  16.6  19.9  23.6
1884  16.2  20.2  23.6
1885  14.8  19.3  23.4
1886  16.9  20.3  25.1
1887  17.3  19.2  24.1
1888  17.5  20.4  22.8
1889  16.3  20.3  25.0
1988  18.1  22.1  25.5
```

### groupby

>groupby操作では、オブジェクトを分割し、関数を適用し、結果を結合します。これは、大量のデータをグループ化し、これらのグループに対する操作を計算するために使用できます。

```py
df = pd.DataFrame({'教科': ['国語', '算数', '算数', '理科', '理科', '社会', '国語'],
                   '点数': [50, 49, 62, 53, 32, 43, 64]})
print(df)
```

```
   教科  点数
0  国語  50
1  算数  49
2  算数  62
3  理科  53
4  理科  32
5  社会  43
6  国語  64
```

```py
# "教科" 列の重複をまとめる
# .mean() により平均を取りながらまとめる
print(df.groupby(['教科']).mean())
```

```
      点数
教科
国語  57.0
理科  42.5
社会  43.0
算数  55.5
```

```py
import pandas as pd
arrays = [['一郎', '一郎', '二郎', '二郎'],
          ['国語', '算数', '国語', '算数']]
index = pd.MultiIndex.from_arrays(arrays, names=('名前', '教科'))
df = pd.DataFrame({'点数': [53, 28, 40, 39]},
                  index=index)
print(df)

# 各生徒の平均点をテーブルにする
print(df.groupby(level=0).mean())

# 各教科の平均点をテーブルにする
print(df.groupby(level=1).mean())
```

```
       点数
名前 教科    
一郎 国語  53
     算数  28
二郎 国語  40
     算数  39

      点数
名前      
一郎  40.5
二郎  39.5

      点数
教科      
国語  46.5
算数  33.5
```

### idxmax

>要求された軸上の最大値のインデックスのうち、最初に出現したインデックスを返します。

```py
students = ['一郎', '二郎', '三郎']
# 国語の点数
japanese = [59, 60, 45]
# 数学の点数
mathmatics = [48, 30, 47]
# 理科の点数
science = [10, 37, 40]
# 社会の点数
social = [60, 57, 22]
df = pd.DataFrame({'国語': japanese, '数学': mathmatics,
                    '理科': science, '社会': social},
                  index=students)
print('df:\n{}\n'.format(df))

# 各教科の最高点を取った生徒のテーブル
print('df.idxmax():\n{}\n'.format(df.idxmax()))

# 各生徒の最高点を取った教科のテーブル
print('df.idxmax():\n{}\n'.format(df.idxmax(axis=1)))
```

```
df:
    国語  数学  理科  社会
一郎  59  48  10  60
二郎  60  30  37  57
三郎  45  47  40  22

df.idxmax():
国語    二郎
数学    一郎
理科    三郎
社会    一郎
dtype: object

df.idxmax():
一郎    社会
二郎    国語
三郎    数学
dtype: object
```

### info

```py
# 列ごとの情報を表示する
print(df.info(verbose=True))
print('------------------------')
# 列ごとの情報は出力しない
print(df.info(verbose=False))
```

```
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, 一郎 to 三郎
Data columns (total 4 columns):
国語    3 non-null int64
数学    3 non-null int64
理科    3 non-null int64
社会    3 non-null int64
dtypes: int64(4)
memory usage: 120.0+ bytes
None
------------------------
<class 'pandas.core.frame.DataFrame'>
Index: 3 entries, 一郎 to 三郎
Columns: 4 entries, 国語 to 社会
dtypes: int64(4)
memory usage: 120.0+ bytes
None
```

### insert

>指定した場所のDataFrameに列を挿入します。

```py
students = ['一郎', '二郎', '三郎']
japanese = [59, 60, 45]
mathmatics = [48, 30, 47]
science = [10, 37, 40]
social = [60, 57, 22]
df = pd.DataFrame({'国語': japanese, '数学': mathmatics,
                    '理科': science, '社会': social},
                  index=students)
print('df:\n{}\n'.format(df))

# 最初の列(loc=0)に体育を追加
df.insert(loc=0, column='体育', value=[65, 12, 58])
print('insert 体育:\n{}\n'.format(df))
```

```
df:
    国語  数学  理科  社会
一郎  59  48  10  60
二郎  60  30  37  57
三郎  45  47  40  22

insert 体育:
    体育  国語  数学  理科  社会
一郎  65  59  48  10  60
二郎  12  60  30  37  57
三郎  58  45  47  40  22
```

### isin

>DataFrameの各要素が値に含まれているかどうかを示します。

```py
students = ['一郎', '二郎', '三郎']
like_subject = ['算数', '社会', '理科']
unlike_subject = ['国語', '理科', '算数']
df = pd.DataFrame({'好きな教科': like_subject, '嫌いな教科': unlike_subject},
                  index=students)
print('df:\n{}\n'.format(df))
# 好きまたは嫌いな強化に"算数"が含まれているか
print(df.isin(['算数']))
# 好きな教科に"算数"が含まれているか
print(df.isin({'好きな教科': ['算数']}))
# 嫌いな教科に"理科"が含まれているか
print(df.isin({'嫌いな教科': ['理科']}))
```

```
df:
   好きな教科 嫌いな教科
一郎    算数    国語
二郎    社会    理科
三郎    理科    算数

    好きな教科  嫌いな教科
一郎   True  False
二郎  False  False
三郎  False   True
    好きな教科  嫌いな教科
一郎   True  False
二郎  False  False
三郎  False  False
    好きな教科  嫌いな教科
一郎  False  False
二郎  False   True
三郎  False  False
```

### items

>DataFrame列を反復処理し、列名とコンテンツを含むタプルをシリーズとして返します。

```py
subjects = ['国語', '算数', '理科', '社会']
score = [65, 45, 36, 64]
mean = [50.46, 58.90, 42.15, 68.96]
df = pd.DataFrame({'点数': score, '平均点': mean},
                  index=subjects)
print(f'df: \n{df}\n')

print('---items example---')
for label, content in df.items():
    print(f'label: {label}')
    print(f'content: \n{content}')
```

```
df: 
    点数    平均点
国語  65  50.46
算数  45  58.90
理科  36  42.15
社会  64  68.96

---items example---
label: 点数
content: 
国語    65
算数    45
理科    36
社会    64
Name: 点数, dtype: int64
label: 平均点
content: 
国語    50.46
算数    58.90
理科    42.15
社会    68.96
Name: 平均点, dtype: float64
```

### rename

>行/列名を変更します。

```py
students = ['一郎', '二郎', '三郎']
japanese = [59, 60, 45]
mathmatics = [48, 30, 47]
science = [10, 37, 40]
social = [60, 57, 22]
df = pd.DataFrame({'国語': japanese, '算数': mathmatics,
                    '理科': science, '社会': social},
                  index=students)
print('df:\n{}\n'.format(df))
df = df.rename(columns={"国語": "japanese", "算数": "mathmatics",
                        "理科": "science", "社会": "social studies"})
print('rename df:\n{}\n'.format(df))
```

```
df:
    国語  算数  理科  社会
一郎  59  48  10  60
二郎  60  30  37  57
三郎  45  47  40  22

rename df:
    japanese  mathmatics  science  social studies
一郎        59          48       10              60
二郎        60          30       37              57
三郎        45          47       40              22
```

### sem

>要求された軸の平均の不偏標準誤差を返します。

```py
print(df.sem(axis=1))
print(df.sem(axis=0))
```

```
年
1876    2.134180
1877    2.191140
1878    2.135637
1879    1.966520
1880    1.930708
          ...
2016    1.938820
2017    2.025990
2018    2.133177
2019    1.990988
2020    1.944590
Length: 145, dtype: float64
-----------------------
1月     0.108507
2月     0.127538
3月     0.122152
4月     0.104449
5月     0.109502
6月     0.111669
7月     0.147541
8月     0.120107
9月     0.118103
10月    0.089512
11月    0.091009
12月    0.099818
年の値    0.070890
dtype: float64
```

### std

>要求された軸のサンプル標準偏差を返します。

```py
print(df.std(axis=1))
print('-----------------------')
print(df.std(axis=0))
```

```
年
1876    7.694895
1877    7.900268
1878    7.700150
1879    7.090387
1880    6.961266
          ...
2016    6.990516
2017    7.304810
2018    7.691279
2019    7.178610
2020    7.011319
Length: 145, dtype: float64
-----------------------
1月     1.306594
2月     1.535764
3月     1.470910
4月     1.257727
5月     1.318581
6月     1.344674
7月     1.776632
8月     1.446284
9月     1.422150
10月    1.077872
11月    1.095893
12月    1.201967
年の値    0.853628
dtype: float64
```

### to_dict

>DataFrameを辞書に変換します。

```py
students = ['一郎', '二郎', '三郎']
japanese = [59, 60, 45]
mathmatics = [48, 30, 47]
science = [10, 37, 40]
social = [60, 57, 22]
df = pd.DataFrame({'国語': japanese, '算数': mathmatics,
                    '理科': science, '社会': social},
                  index=students)
df.to_dict()
```

```
{'国語': {'一郎': 59, '二郎': 60, '三郎': 45},
 '算数': {'一郎': 48, '二郎': 30, '三郎': 47},
 '理科': {'一郎': 10, '二郎': 37, '三郎': 40},
 '社会': {'一郎': 60, '二郎': 57, '三郎': 22}}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/621414/26b555de-1242-b9f8-c679-77a9228795f0.png)

### transpose

>行と列を転置します。

 
```py
students = ['一郎', '二郎', '三郎']
japanese = [59, 60, 45]
mathmatics = [48, 30, 47]
science = [10, 37, 40]
social = [60, 57, 22]
df = pd.DataFrame({'国語': japanese, '算数': mathmatics,
                    '理科': science, '社会': social},
                  index=students)
print(df)
print('-------------------')
print(df.T)
```

```
    国語  算数  理科  社会
一郎  59  48  10  60
二郎  60  30  37  57
三郎  45  47  40  22
-------------------
    一郎  二郎  三郎
国語  59  60  45
算数  48  30  47
理科  10  37  40
社会  60  57  22
```

### var

>要求された軸上の不偏分散を返します。

```py
print(df.var(axis=1))
print('-----------------------')
print(df.var(axis=0))
```

```
年
1876    59.211410
1877    62.414231
1878    59.292308
1879    50.273590
1880    48.459231
          ...
2016    48.867308
2017    53.360256
2018    59.155769
2019    51.532436
2020    49.158590
Length: 145, dtype: float64
-----------------------
1月     1.707187
2月     2.358570
3月     2.163576
4月     1.581877
5月     1.738656
6月     1.808148
7月     3.156420
8月     2.091739
9月     2.022511
10月    1.161807
11月    1.200982
12月    1.444725
年の値    0.728681
dtype: float64
```

# 参考記事

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html