2017-08-24 20 views
2

グループ化されたオブジェクトに対する操作を実行すると、変数を作成した後、私はこのようになり、データフレームを持つデータフレームをインデックス作成:はそれに応じて

Id Category Score 
1  M  0.2 
2  C  0.4 
2  M  0.3 
1  C  0.1 
2  M  0.3 
1  M  0.2 
1  C  0.1 
1  C  0.1 
2  C  0.4 

私はIdCategoryによってグループ化する、そして最高を見つけますスコアを計算して、Category_Labelという新しい変数を作成します。この変数の行は最大スコアインデックスでCategoryに等しくなります。

出力は、言い換えれば、この

Id Category Score Category_Label 
1  M  0.2   M 
2  C  0.4   C 
2  M  0.3   C 
1  C  0.1   M 
2  F  0.03   C 
1  M  0.2   M 
1  C  0.1   M 
1  E  0.01   M 
2  C  0.4   C 

のようになります、すべて1

の最大スコアに対応する新しい変数「Category_Label should be equal to the row of Category`は、私はこれを試してみました

df[df['Category_Label']] == df.loc[df.groupby(['Id','Category'])['Score'].transform(lambda a: a.max())],'Category' ] 

しかし、私は遠く離れています!このquestionthisを調べましたが、十分に役立たないです。

答えて

4
  • 利用idxmaxmapを見つけるためにすることを、使用しています。
  • transformを使用して、すべてのインデックスをブロードキャストします。新しい列

df.assign(
    Category_Label=df.loc[ 
     df.groupby('Id').Score.transform('idxmax'), 
     'Category' 
    ].values 
) 

    Id Category Score Category_Label 
0 1  M 0.2    M 
1 2  C 0.4    C 
2 2  M 0.3    C 
3 1  C 0.1    M 
4 2  M 0.3    C 
5 1  M 0.2    M 
6 1  C 0.1    M 
7 1  C 0.1    M 
8 2  C 0.4    C 
+0

@JohnGaltは質問を読んで、OPは '['Id'、 'C​​ategory']' 。しかし、それは意味をなさない。それを指摘していただきありがとうございます。 – piRSquared

+0

私はあなたのソリューションが好きです。これははるかにクリーンです。 – Zero

+0

うわー〜ニースと簡潔!:) – Wen

4

applyを使用してScoreidxmaxを取得し、Category値に使用できます。その後max位置がどこにあるかId

In [1591]: df.Id.map(df.groupby('Id').apply(lambda x: x.loc[x.Score.idxmax(), 'Category'])) 
Out[1591]: 
0 M 
1 C 
2 C 
3 M 
4 C 
5 M 
6 M 
7 M 
8 C 
Name: Id, dtype: object 

詳細

In [1592]: df.groupby('Id').apply(lambda x: x.loc[x.Score.idxmax(), 'Category']) 
Out[1592]: 
Id 
1 M 
2 C 
dtype: object 

In [1593]: df['Category_Label'] = df.Id.map(
           df.groupby('Id') 
           .apply(lambda x: x.loc[x.Score.idxmax(), 'Category'])) 

In [1594]: df 
Out[1594]: 
    Id Category Score Category_Label 
0 1  M 0.2    M 
1 2  C 0.4    C 
2 2  M 0.3    C 
3 1  C 0.1    M 
4 2  M 0.3    C 
5 1  M 0.2    M 
6 1  C 0.1    M 
7 1  C 0.1    M 
8 2  C 0.4    C 
+0

"1594" せずに試すことができます...時間にCategory

  • 割り当てをつかむためにloc
  • 使用結果REPLを再起動する:p –

  • 1

    それとも、groupby

    df.merge(df.sort_values(['Id','Score']).\ 
        drop_duplicates(['Id'],keep ='last')[['Id','Category']],on='Id',how='left').\ 
        rename(columns={'Category_x':'Category','Category_y':'Category_Label'}) 
    
    
    
    Out[176]: 
        Id Category Score Category_Label 
    0 1  M 0.20   M 
    1 2  C 0.40   C 
    2 2  M 0.30   C 
    3 1  C 0.10   M 
    4 2  F 0.03   C 
    5 1  M 0.20   M 
    6 1  C 0.10   M 
    7 1  E 0.01   M 
    8 2  C 0.40   C 
    
    関連する問題