2017-10-07 24 views
0

あたりの条件の最初の出現の列の値を取得する:パンダは、次のように私はパンダのデータフレームを持っているグループ

player condition num 
A  0   1 
A  1   2 
A  1   3 
B  0   1 
B  0   2 
B  1   3 
B  0   4 

私はあたりplayernum列の最小値を格納する列を追加したいですconditionカラムはです。

結果、したがって、次のようになります。

player condition num numCondition 
A  0   1 2 
A  1   2 2 
A  1   3 2 
B  0   1 3 
B  0   2 3 
B  1   3 3 
B  0   4 3 

私はplayerあたりgroupBy()が必要であることを知っています。おそらくlambda()機能を使用してapply()が必要になります。しかし、私は一緒に作品を合わせることはできませんでした。

編集:私の例ではconditionの列は単純化されています。実際には、通常のパンダのデータフレームクエリを使用して行をフィルタリングするだけで済みます。例えば。 df[(df.condition == 1) & (df.otherCondition > 10)]

答えて

1

条件が一つのグループのために会ったことがないされている場合、何が起こるかdrop_duplicates

df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num) 
    Out[221]: 
    0 2 
    1 2 
    2 2 
    3 3 
    4 3 
    5 3 
    6 3 
    Name: player, dtype: int64 

df['numCondition']=df.player.map(df[df.condition==1].drop_duplicates(['player'],keep='first').set_index('player').num) 
df 
Out[223]: 
    player condition num numCondition 
0  A   0 1    2 
1  A   1 2    2 
2  A   1 3    2 
3  B   0 1    3 
4  B   0 2    3 
5  B   1 3    3 
6  B   0 4    3 
+0

thx! 1つのグループで条件が満たされない場合はどうなりますか?つまり、1つのグループに値1が決して存在しませんか? – beta

+0

@betaはNaNに置き換えられます.NaNは、 'replace'または' fillna'によって実行されます。 – Wen

1

集計は、まず、次にplayerdfバックに参加:

df.join(
    df.groupby('player') 
     .apply(lambda g: g.num[g.condition == 1].min()) 
     .rename('numCondition'), 
on='player') 

# player condition num numCondition 
#0  A   0  1 2 
#1  A   1  2 2 
#2  A   1  3 2 
#3  B   0  1 3 
#4  B   0  2 3 
#5  B   1  3 3 
#6  B   0  4 3 
+0

を使用することにより?つまり、1つのグループに値 '1'は決してありませんか? – beta

+0

それはそのプレイヤーのためにすべての 'NaN'を与えます。 – Psidom

+0

'numCondition'列の' Nan'ですか?はいの場合、NaNを交換する最も簡単な方法は何ですか? – beta

関連する問題