2017-10-11 6 views
2

this questionに基づいています。Groupby + Applyは不要なマルチインデックスを生成します

df = pandas.DataFrame([[2001, "Jack", 77], [2005, "Jack", 44], [2001, "Jill", 93]],columns=['Year','Name','Value']) 

    Year Name Value 
0 2001 Jack 77 
1 2005 Jack 44 
2 2001 Jill 93 

それぞれユニークな名前のために、私は最大の 年の値を持つ行を維持したいと思います。最善のアプローチ

df.groupby('Name', as_index=False)\ 
    .apply(lambda x: x.sort_values('Value').head(1)) 
    Year Name Value 
0 0 2001 Jack  44 
1 2 2001 Jill  93 

ないが、私はもっと興味:上記の例では、私はgroupby +(apply)でこの質問を解決しようとしたテーブル

Year Name Value 
0 2005 Jack 44 
1 2001 Jill 93 

を取得したいと思い何が起こっているのか、そしてなぜそれが起こったのか。結果は次のようになりますMultiIndexを持っている:私は回避策を探していないよ

MultiIndex(levels=[[0, 1], [0, 2]], 
      labels=[[0, 1], [0, 1]]) 

。私は実際になぜこれが起きているのか、私のアプローチを変えずにそれを防ぐ方法を知りたいと思っています。

+0

'df.groupby([ '名前'])[[ '年'、 '値']]最大を()。 .reset_index() '? –

+0

@StefanoPotter実際には、私の最初の答えが誤解を招く場合は、最大の行、謝罪を取り除くために探しています。 –

+2

あなたがapplyを使用し、データの長さがどのように開始されたかとは異なるときはいつでも、pandasはインデックス内のグループ化キーを使用します。それ以外の場合、グループ化キーを使用しないように指定すると、pandasはデータをまとめてグルーピングします。 as indexがfalseに等しいと指定した場合、pandasはグループ化キーの因数分解バージョンを使用します。 – piRSquared

答えて

2

IIUC、group_keys=False使用:

df.groupby('Name', group_keys=False).apply(lambda x: x.sort_values('Value').head(1)) 

出力:

Year Name Value 
1 2005 Jack  44 
2 2001 Jill  93 
+0

はい、あなたは正しいことを理解しました。なぜマルチインデックスが作成され、 'group_keys'がそれを回避するのか、 –

+0

[docs](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html#pandas-dataframe-groupby)、「group_keys:boolean、default True」 呼び出し時適用、グループのキーを追加してピースを識別する " –

+0

私は、ドキュメントのことを知っています。あなたがそれを私が従うことができる方法で説明できるかどうか見てください。 :pとにかく助けてくれてありがとう。 –

関連する問題