問題

私のデータフレームは次のようになります:

     name1  name2   value
 1  Jane   Foo     2
 2  Jane   Bar     4
 3  John   Foo     7
 4  John   Bar     1
 

df.groupby(['name1', 'name2']).count() を実行すると、次のようになります。

               value
name1  name2
Jane   Foo    1
Jane   Bar    1
John   Foo    1
John   Bar    1
 

しかし、私は各マルチインデックスグループ内の各値のランクを見つけようとしています。理想的には、 df.groupby(['name1', 'name2']).rank() を使用すると、次のようになります。

              value
name1  name2
Jane   Foo    2
Jane   Bar    1
John   Foo    1
John   Bar    2
 

しかし、代わりに私は単に得る:

     value
  1  1
  2  1
  3  1
  4  1
 

グループ化された列の名前が削除されると、インデックス番号だけがインデックスになり、すべての行のランク値は1になります。私は間違って何をしていますか?

  ベストアンサー

私はあなたが数値で作業する必要があると思うので、最初の列name1であり、valuerankを返す必要があるようです:

 df['rank'] = df.groupby('name1')['value'].rank(method='dense', ascending=False).astype(int)
print (df)
  name1 name2  value  rank
1  Jane   Foo      2     2
2  Jane   Bar      4     1
3  John   Foo      7     1
4  John   Bar      1     2
 

  同じタグがついた質問を見る

pythonpandas