[python][pandas]long型データフレームの取り扱い

people gathered watching a panda mascot python
Photo by Jeffrey Czum on Pexels.com

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)

関連リンク

データフレームのwide-long変換
データフレームの中から条件を満たす列のIDを取得

コメント

タイトルとURLをコピーしました