分析で利用するpandasのDataFrame(データの操作編)

前記事からの続きです。
前の記事はこちら

https://qiita.com/y_haruki/items/0143d830898667412356

利用するデータは説明のため以下のデータを利用します。
今回説明のため、適当に、日付を入れています。
また、わかりやすいように欠損値(pd.NA)を入れています。

``` py:
import pandas as pd

df = pd.DataFrame({'DATE':['2023/3/24','2024/3/24','2023/3/26','2024/3/26','2023/3/28','2024/3/30','2024/3/30'],
                    'GOOG':[158.56,157.21,167.31,168.42,167.19,pd.NA,168.83]
                   })
```

行と列の値の関係が見やすいように、df.head(7)の実行結果を表示させます。
``` :実行結果
        DATE    GOOG
0  2023/3/24  158.56
1  2024/3/24  157.21
2  2023/3/26  167.31
3  2024/3/26  168.42
4  2023/3/28  167.19
5  2024/3/30    <NA>
6  2024/3/30  168.83

```

``` py:
```

``` :実行結果
```


データの操作
### 1\. df.sort_values()
指定した列で昇順または降順にソートします。

``` py:
df = df.sort_values('GOOG', ascending=False)
print(df)
```
``` :実行結果
        DATE    GOOG
6  2024/3/30  168.83
3  2024/3/26  168.42
2  2023/3/26  167.31
4  2023/3/28  167.19
0  2023/3/24  158.56
1  2024/3/24  157.21
5  2024/3/30    <NA>
```
ascendingは日本語で「上昇」の意味です。
Falseが設定されていますので、降順に並び替えられます。
なので、'GOOG'列の数字が降順になっています。

また、デフォルトは昇順になっているので、 ascendingの指定がない場合は
昇順になります。

``` py:
df = df.sort_values('GOOG')
print(df)
```
``` :実行結果
        DATE    GOOG
1  2024/3/24  157.21
0  2023/3/24  158.56
4  2023/3/28  167.19
2  2023/3/26  167.31
3  2024/3/26  168.42
6  2024/3/30  168.83
5  2024/3/30    <NA>

```
一度、昇順に並び替えをし、昇順にしたデータに順にインデックスをつけ直したい場合は次の操作になります。

``` py:
df = df.sort_values('GOOG').reset_index(drop=True)
print(df)
```


``` :実行結果
        DATE    GOOG
0  2024/3/24  157.21
1  2023/3/24  158.56
2  2023/3/28  167.19
3  2023/3/26  167.31
4  2024/3/26  168.42
5  2024/3/30  168.83
6  2024/3/30    <NA>

```
直前の昇順に並べた実行結果と比較すると
index 0,1,3,4,5　の値が変わっていることが確認できます。



### 2\. df.fillna()
欠損値を指定した値で埋めます。

``` py:
df = df.fillna(0)
print(df)
```
``` :実行結果
       DATE    GOOG
0  2023/3/24  158.56
1  2024/3/24  157.21
2  2023/3/26  167.31
3  2024/3/26  168.42
4  2023/3/28  167.19
5  2024/3/30    0.00
6  2024/3/30  168.83
<ipython-input-47-089b7cc944b8>:1: FutureWarning: Downcasting object dtype arrays on .fillna, .ffill, .bfill is deprecated and will change in a future version. Call result.infer_objects(copy=False) instead. To opt-in to the future behavior, set `pd.set_option('future.no_silent_downcasting', True)`
  df = df.fillna(0)
```
index 5番が<NA>から0.00に変わっていることが確認できます。


### 3\. df.dropna()
欠損値を含む行または列を削除します。

``` py:
df = df.dropna()
print(df)
```

``` :実行結果
        DATE    GOOG
0  2023/3/24  158.56
1  2024/3/24  157.21
2  2023/3/26  167.31
3  2024/3/26  168.42
4  2023/3/28  167.19
6  2024/3/30  168.83
```
index 5 番目の行が削除されたことが確認できます。
<br><br><br>
ここで、ブループ化のために一度データを追加します。
``` py:
df1 = pd.DataFrame({'SIGN':['AAA','AAA','BBB','BBB','CCC','DDD','DDD'],
                    'GOOG':[158.56,157.21,167.31,168.42,167.19,pd.NA,168.83],
                    'AMZN':[186.61,181.96,184.76,185.13,186.33,187.97,188.07]
                   })

```
print文を実行させると以下の結果になります。

``` :実行結果
  SIGN    GOOG    AMZN
0  AAA  158.56  186.61
1  AAA  157.21  181.96
2  BBB  167.31  184.76
3  BBB  168.42  185.13
4  CCC  167.19  186.33
5  DDD    <NA>  187.97
6  DDD  168.83  188.07
```


### 4\. df.groupby()
データをグループ化します。
グループごとに合計を計算する。
``` py:
grouped = df1.groupby('SIGN').sum()
print(grouped)
```

``` :実行結果
        GOOG    AMZN
SING                
AAA   315.77  368.57
BBB   335.73  369.89
CCC   167.19  186.33
DDD   168.83  376.04
```
グループ内で最高値の値を抽出する。
``` py:
grouped = df1.groupby('SING').max()
print(grouped)
```
``` :実行結果
        GOOG    AMZN
SIGN                
AAA   158.56  186.61
BBB   168.42  185.13
CCC   167.19  186.33
DDD   168.83  188.07
```

### 5\. df.apply()
各行または各列に任意の関数を適用します。
今回、GOOG 列の値を２倍して、新規に追加する、df['double_GOOG']の列に値を代入します。

``` py:
df['double_GOOG'] = df['GOOG'].apply(lambda x: x * 2)
```
``` :実行結果
        DATE    GOOG  double_GOOG
0  2023/3/24  158.56       317.12
1  2024/3/24  157.21       314.42
2  2023/3/26  167.31       334.62
3  2024/3/26  168.42       336.84
4  2023/3/28  167.19       334.38
6  2024/3/30  168.83       337.66
```
左側の GOOG列の値を2倍すると、左側の列 double_GOOGになることがかくにんできます。