long型データフレームの取り扱い方法について
pandasを用いる。
pandas - Python Data Analysis Library
例えば、次のようにIDごとにいくつか検査値があり、この中で最大値のみを取り出したいとする。
import pandas as pd
pd.DataFrame({"ID" :np.repeat(np.arange(4), 3), "res":[4, 2, 5, 10, 4, 2, 3, 3, 6, 0, 9, 3]})
ID res
0 0 4
1 0 2
2 0 5
3 1 10
4 1 4
5 1 2
6 2 3
7 2 3
8 2 6
9 3 0
10 3 9
11 3 3
もしも、数値に”<1″など文字列が入っているときは、あらかじめ数値に変換しておく。
dt = dt.replace("<1", "1")
dt["res"] = dt["res"].apply(pd.to_numeric, errors = 'coerce')
まずはgroupbyでIDごとにまとめる。
dt.groupby("ID")
次に必要なcolumnsを取り出す。
dt.groupby("ID")["copy"]
最後に最大値があるargを返すidxmaxを使う。
dt.groupby("ID")["copy"].idxmax()
この結果を用いて、以下のようにするとresが最大のときの値のみ取り出せる。
#最大値のあるindexの取得
max_idx = dt.groupby("ID")["copy"].idxmax()
dt.loc[max_idx, "max_"] = True
dt_new = dt[dt["max_"] == True]
dt_new
ID res max_
2 0 5 True
3 1 10 True
8 2 6 True
10 3 9 True
いらないcolumnsを落としたり、IDでソートしたり、indexをリセットするときは以下を行う。
dt_new = dt_new[["ID", "res"]]
dt_new = dt_new.sort_values("ID")
dt_new = dt_new.reset_index(drop = True)
コメント