以下は、groupby グループ内の最大値を持つ行を取得するための pandas メソッドです。これは、優れた参考値を持っているので、皆さんのお役に立てれば幸いです。一緒に見てみましょう
groupbyグループ内の最大値の行を取得するpandasメソッド
例えば、以下のDataFrameでMtでグループ化されている場合、Countが最大の行を取り出します
import pandas as pd df = pd.DataFrame({'Sp':['a','b','c','d','e','f'], 'Mt':['s1', 's1', 's2','s2','s2','s3'], 'Value':[1,2,3,4,5,6], 'Count':[3,2,5,10,10,6]}) df
数 | 山 | Sp | 値 | |
---|---|---|---|---|
0 | 3 | s1 | a | 1 |
1 | 2 | s1 | b | 2 |
2 | 5 | s2 | c | 3 |
3 | 10 | s2 | d | 4 |
4 | 10 | s2 | e | 5 |
5 | 6 | s3 | f | 6 |
方法 1: 次の行をフィルターします。グループ内で最大のカウント うーん
山
|
s1 | 0 | |||
---|---|---|---|---|---|
s1 | a | 1s2 | 3
10 |
s2 | d|
4 | 10 | s2 | e | 5 | メソッド2: 変換を使用して元のデータフレームのインデックスを取得します。そして、必要な行をフィルターで除外します |
df.groupby('Mt').apply(lambda t: t[t.Count==t.Count.max()]) |
print df.groupby(['Mt'])['Count'].agg(max) idx=df.groupby(['Mt'])['Count'].transform(max) print idx idx1 = idx == df['Count'] print idx1 df[idx1] |
||||
Count | Mt | Sp | |||
0 | 3 | s1 | a |
310
s2d4 4
10
5 |
5 | 6 | s3 | |
---|---|---|---|---|
上記のメソッドの問題は、行 3 と行 4 の値がすべて最大値であるため、複数の行が返されることです。1 行だけが返された場合はどうなるでしょうか。 ? | 方法 3: idmax (パンダの古いバージョンは argmax) | |||
Mt s1 3 s2 10 s3 6 Name: Count, dtype: int64 0 3 1 3 2 10 3 10 4 10 5 6 dtype: int64 0 True 1 False 2 False 3 True 4 True 5 True dtype: bool |
idx = df.groupby('Mt')['Count'].idxmax() print idx |
|||
カウント | Mt | Sp | ||
0 | 3 | s1 | a |
310s2
d
4
56
s3
レア | ||||
---|---|---|---|---|
数 | 山 | Sp | 値 | |
0 | 3 | s1 | a | |
3 | 10 | s2 | d | 4 |
5
6
s3
| りー | りー | ||
---|---|---|---|---|
Mt | Value | |||
0 | s1 | 1 | 3 | |
4 | 5 | s3 | 6 |
方法 4: まず並べ替えて、各グループから最初のものを取り出します
df.iloc[idx] Mt s1 0 s2 3 s3 5 Name: Count, dtype: int64
Mt | ||
---|---|---|
価値 | ||
s1 | 3 | a |
1 | s2 |
4
2s36
f
考え方はまだ似ていますが、特定の書き込みメソッドでいくつかの変更が必要な場合があります。たとえば、メソッド 1 と 2 は max アルゴリズムを変更する必要があり、メソッド 3 はインデックスを返すメソッドを実装する必要があります。 とにかく、groupby の後、各グループはデータフレームになります。 | 関連する推奨事項: | pandas+dataframe は行と列の選択とスライス操作を実装します | ||
---|---|---|---|---|
以上がgroupbyグループ内の最大値を持つ行を取得するpandasメソッドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。