4

パンダのデータフレームを 1 つの列でグループ化すると、「バージョン」と言い、10 個の異なるバージョンがあります。トップ 3 (90% 以上をカバー) をプロットし、残りの小さな部分を 1 つの「その他」のバケットに入れるにはどうすればよいでしょうか。

data = array([
              ('Top1', 14),
              ('Top1', 3),
              ('Top1', 2),
              ('Top2', 6),
              ('Top2', 7),
              ('Other1', 1),
              ('Other2', 2),
         ], 
      dtype=[('Version', 'S10'),('Value', '<i4')])
df = DataFrame.from_records(data)
df.groupby('Version').sum()

これは以下を返します:

Value
Version 
Other1   1
Other2   2
Top1     19
Top2     13

を探しています

Value
Version 
Others   
Top1     19
Top2     13

バージョン名 Other* および Top* は、例として選択されています。

もちろん、これは、グループ化してしきい値と比較した後、カテゴリを手動で「その他」に設定することで可能です。ショートカット希望でした。

4

3 に答える 3

9

Otherあなたの例では、グループを合計して3つにしたいと思いますか?

Pandas のワンライナー コンテストに勝つことを目指していた場合、これが私のエントリになります。

df.replace(df.groupby('Version').sum().sort('Value', ascending=False).index[2:], 'Other').groupby('Version').sum()

         Value
Version       
Other        3
Top1        19
Top2        13

しかし、それは完全に判読できないので、分解してみましょう。

各グループを合計する方法は既に示しました。この結果を並べ替えて、上位 2 つ以外のものを選択するには、次のようにします。

not_top2 = df.groupby('Version').sum().sort('Value', ascending=False).index[2:]

この例では、 とnot_top2が含まれています。Other1Other2

Versionsこれらを一般的な名前に置き換えるには、次のようにします。

dfnew  = df.replace(not_top2, 'Other')
print dfnew

  Version  Value
0    Top1     14
1    Top1      3
2    Top1      2
3    Top2      6
4    Top2      7
5   Other      1
6   Other      2

上記は、not_top2任意の列の内容を置き換えます。この値が 以外の列にあると予想される場合は、少しサブステップが必要ですVersion

残っているのは、元のグループ化をもう一度行うことです。

dfnew.groupby('Version').sum()

これにより、次のことが得られます。

         Value
Version       
Other        3
Top1        19
Top2        13
于 2013-11-07T15:12:39.520 に答える