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
が出ます。現状、解決策見つかっていないので改善の余地ありです。