前記事からの続きです。
前の記事はこちら
利用するデータは説明のため以下のデータを利用します。
今回説明のため、適当に、日付を入れています。
また、わかりやすいように欠損値(pd.NA)を入れています。
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
データの操作
1. df.sort_values()
指定した列で昇順または降順にソートします。
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の指定がない場合は
昇順になります。
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>
一度、昇順に並び替えをし、昇順にしたデータに順にインデックスをつけ直したい場合は次の操作になります。
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()
欠損値を指定した値で埋めます。
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番がから0.00に変わっていることが確認できます。
3. df.dropna()
欠損値を含む行または列を削除します。
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 番目の行が削除されたことが確認できます。
ここで、ブループ化のために一度データを追加します。
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()
データをグループ化します。
グループごとに合計を計算する。
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
グループ内で最高値の値を抽出する。
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 列の値を2倍して、新規に追加する、df['double_GOOG']の列に値を代入します。
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になることがかくにんできます。