2017-08-16 13 views
1

を適用して、私は、例えば次のような構造でPANDASのデータフレームを持っている:GROUPBYは/データフレームに操作を適用した後、どこ所望の出力PANDASグループ化

id,sex,age,rank,skill 
1,M,9,1,A 
1,M,8,2,G 
1,M,10,3,F 
2,F,10,3,M 
2,F,8,4,W 
2,F,6,4,O 
3,M,5,1,Q 
3,M,4,3,N 
3,M,9,4,Y 

です:

id,sex,age,rank,skill 
1,M,8,1,A 
2,F,6,3,M 
3,M,4,1,Q 

言い換えれば、idフィールド、性別フィールドが変化しないこと、年齢値のmin()、階級値のmin()、min()の現在のスキル値ランク値。

私は、dict内のgroupbyに複数のagg関数を渡すことができますが、定数の値を扱う方法やグループの別のフィールドの関数の結果に依存する方法はわかりません。

答えて

2

はプットを期待、それはrankminですが、あなたの説明で、あなたはそれがあなたに私の答えのベースは温首相のために出力

df.groupby(['id','sex'],as_index=False).agg({'age':'min','rank':'min'}).\ 
merge(df.drop('age',1),on=['id','sex','rank'],how='left') 

Out[931]: 
    id sex age rank skill 
0 1 M 8  1  A 
1 2 F 6  3  M 
2 3 M 4  1  Q 
+0

これは間違いなく最良のアプローチです。私は、kbballの再構成されたバージョンがちょっとわかりやすいと思っています。 – Pylander

+0

@Pylander喜んでそれも助けて、ステップバイステップは、常に私の将来の投稿で考慮する必要があります、ありがとう〜ニースの日 – Wen

1

定数値を持つ列の場合は、first、lastなどのいくつかのオプションがあります。最高(またはあなたの例では最小)のランク値に対応するスキル値については、idxminを使用する必要があります。 idxminを動作させるには、スキルをインデックスにする必要があります。最初のステップでインデックスとして設定します。あなたに

df.set_index('skill').groupby('id').agg({'sex': 'first', 
             'age': 'min', 
             'rank': ['min', 'idxmin']}) 
Out: 
    sex age rank  
    first min min idxmin 
id      
1  M 8 1  A 
2  F 6 3  M 
3  M 4 1  Q 
+0

idxminを統合する方法を説明してくれてありがとう。私はランク値をmin()に修正しました。私の混乱です。もう1つの質問ですが、idxmin出力の名前を元のフィールド名に変更するのは簡単ですか?私は実際の例でこのように設定する必要がある多くの列を持つ可能性が高いです。 – Pylander

+0

@Pylanderランク列で関数が呼び出されるため、その名前が関連付けられます。しかし、マルチインデックスの名前を変更するのは本当に苦痛です。私は自分自身からスクラッチからフラットな列のリストを構築するだろう。温家宝のアプローチはより適切かもしれないかもしれない? – ayhan

+0

はい、残念ながら、このアプローチの限界を知りました。非常にきれいなフォーマットですが、好きです。 Wenの答えは、kbballによって再フォーマットされ、最終的にはうまくいくでしょう。 – Pylander

1

+1を期待max

で言及。

鉱山は、さらにいくつかのステップがありますが、あなたがフォローしていない場合、それはおそらく読みやすい同じ考えだと:

func = {'sex': 'min', 'age': 'min', 'rank': 'min'} 

df_agg = df.groupby('id').agg(func) 
df_agg = df_agg.reset_index() 

df = df.drop('age', 1) 
df = pd.merge(df_agg, df, on = ['id', 'sex', 'rank']) 

は、各列に適用する集計を設定します。その後、aggを使用してidでグループ化します。この時点でインデックスをリセットする必要があります。そうしないと、IDがインデックスとして扱われるため、次のステップでマージを実行することはできません。

dfには元のデータフレームがまだ保存されています。 df_aggに保存されている、最小化された年齢だけが必要なので、dfから年を削除します。一致すると予想される列(ID、性別、ランク)でマージを実行します。あなたは乗り物に沿って正しいスキルを引き出すためにランクに合併しています。

+0

私は温に信用を与えなければならないが、私はあなたの適応ソリューションを使用しています終わり。ありがとう! – Pylander