概要 | |
---|---|
目的 | Group毎の集計値を用いたデータ処理方法の紹介 |
分類 | Pandas Cookbook |
Table of Contents
問題設定: Group毎の合計値に対する割合の計算
以下のコマンドを叩いて次のようなデータを得たとします:
1
2
df = pd.read_csv('https://raw.githubusercontent.com/RyoNakagami/pandas_for_everyone/master/data/gapminder.tsv', sep='\t')
df.head()
country | continent | year | lifeExp | pop | gdpPercap |
---|---|---|---|---|---|
Afghanistan | Asia | 1952 | 28.801 | 8425333 | 779.445314 |
Afghanistan | Asia | 1957 | 30.332 | 9240934 | 820.853030 |
Afghanistan | Asia | 1962 | 31.997 | 10267083 | 853.100710 |
Afghanistan | Asia | 1967 | 34.020 | 11537966 | 836.197138 |
Afghanistan | Asia | 1972 | 36.088 | 13079460 | 739.981106 |
… | … | … | … | … | … |
pop
カラムにはそれぞれの年度ごとの各国の人口が格納させています. この時, 各年度における各国の人口が世界トータル人口に対して何割くらいなのか?を計算したいとします.
方針: transform関数の利用
aggregate
:groupby
で指定したグループについての複数の値を受け取り,groupに付き1つの集計値を返すtransform
:groupby
で指定したグループについての複数の値を受け取り集計値を計算するが, レコードにつき, そのレコードが所属するgroupの集計値を返す
解答例
1
df['pop_ratio'] = df.groupby('year')['pop'].transform(lambda x: x / sum(x))
応用編
ランキング値を計算したい場合
1
2
df.groupby('year')['pop'].transform('rank')
df.groupby('year')['pop'].transform('rank', method='dense', pct=False)
パラメータ
- method :
{average, min, max, first, dense}
- average: average rank of group
- min: lowest rank in group
- max: highest rank in group
- first: ranks assigned in order they appear in the array
- dense: like ‘min’, but rank always increases by 1 between groups
- pct : boolean, default False
- データのパーセンテージ順位を返す
Delivery Noに対して何回目の配送なのかを計算したい場合
Data
1
2
3
4
5
6
7
8
9
df.head()
delivery_no,delivery_date,delivery_time,is_success,is_notice,is_booked
74231116,20220818,1050,1,1,0
74231112,20220818,1354,1,1,0
74231115,20220818,1331,1,1,0
74231010,20220818,1905,1,1,1
74231016,20220818,1227,1,1,0
...
delivery_no | 送り状No(再配達の場合同じ番号で再度レコードに記録されるので,同じ番号が出現する可能性はある) |
delivery_date | 配達日, 文字列 |
delivery_time | 配達時間, 文字列, xx時yy分をxxyy で表記 |
is_success | 配達成功フラグ, 0の場合は後ほど再配達される |
is_notice | 事前通知フラグ |
is_booked | 事前予約フラグ |
やりたいこと
iter_no
という新たなカラムを作成し, そこに送り状No単位で何回目の配達なのか?をint
で記録する(初回配達ならば1)- 何回目の配達かは配達時間の順番で設定する
実行例
1
2
3
4
5
6
7
8
9
10
11
import pandas as pd
import numpy as np
##配達時間datatimeカラムの作成
df['delivery_datetime'] = df['delivery_date'] + ' ' + df['delivery_time']
df['delivery_datetime'] = pd.to_datetime(df['delivery_datetime'], format='%Y%m%d %H%M')
##配達時間ランキング作成
df['iter_no'] = np.int64(df.groupby(['delivery_no'])['delivery_datetime'].rank(ascending=True, method='dense'))
df.sort_values(['delivery_no','iter_no'],inplace=True) ##見やすくするため
df_fixed = df.reset_index(drop=True)
zスコアを計算したい場合
一人あたりGDPについて年度でグルーピングを実施した時のzscoreを計算したくなったとします.
1
2
3
4
5
6
7
8
def get_zscore(x):
"""
与えられたデータについてzscoreを返す
xはベクトル or Series
"""
return (x - x.mean()) / x.std()
df.groupby('year')['gdpPercap'].transform(get_zscore)
References
Stackoverflow
統計
Python
math
Linux
Ubuntu 20.04 LTS
Shell
English
git
方法論
Ubuntu 22.04 LTS
統計検定
競技プログラミング
フーリエ解析
前処理
SQL
coding
コミュニケーション
Network
ssh
将棋
Data visualization
Docker
Econometrics
VSCode
statistical inference
GitHub Pages
apt
development
システム管理
Coffee
cloud
数値計算
素数
Book
Font
Metrics
Poetry
Ubuntu 24.04 LTS
architecture
aws
shell
systemctl
テンプレート
データ構造
ポワソン分布
会計分析
文字コード
環境構築
論文
App
Bayesian
Dynamic Programming
Keyboard
Processing
R
Steam
filesystem
quarto
regex
(注意:GitHub Accountが必要となります)