Abstract
pandasでカテゴリごとに最大値、最小値を抽出するのは、難しくないです。
今回は、最大値、最小値にラベルをつけるスクリプト考えていて、結構長めにつまったのでメモを残します。
Situation
| idx | category_id | id | incremental | 
|---|---|---|---|
| 0 | 1 | 1 | 1 | 
| 1 | 1 | 2 | 2 | 
| 2 | 1 | 3 | 3 | 
| 3 | 2 | 4 | 1 | 
| 4 | 2 | 5 | 2 | 
| 5 | 2 | 6 | 3 | 
| ... | ... | ... | ... | 
みたいなテーブルを考えます。
この時、以下の問いを考えます。
カテゴリごとの最大値、最小値に対してフラグを持たせる
最終的には、こんな感じに慣ればいいです。
| idx | category_id | id | incremental | is_first | is_last | 
|---|---|---|---|---|---|
| 0 | 1 | 1 | 1 | 1 | 0 | 
| 1 | 1 | 2 | 2 | 0 | 0 | 
| 2 | 1 | 3 | 3 | 0 | 1 | 
| 3 | 2 | 4 | 1 | 1 | 0 | 
| 4 | 2 | 5 | 2 | 0 | 0 | 
| 5 | 2 | 6 | 3 | 0 | 1 | 
| ... | ... | ... | ... | ... | ... | 
Script
csvを読むとして書きます。
import pandas as pd 
df = pd.read_csv('file_name')
df['is_first'] = np.where(df.index.isin(df.groupby('category_id').incremental.idxmin()), 1, 0)
df['is_last']  = np.where(df.index.isin(df.groupby('category_id').incremental.idxmax()), 1, 0)
カテゴリが増えてもとりあえず、対応はできます。
TODO
SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead
が出ます。現状、解決策見つかっていないので改善の余地ありです。