如何将超过前N的"剩余"结果分组到带有熊猫的"其他"中

Cil*_*vic 3 python pandas

当一个pandas数据帧按一列分组时说"版本"并且有10个不同的版本.如何绘制前三名(覆盖超过90%)并将小余数放入一个"其他"-Bucket.

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()
Run Code Online (Sandbox Code Playgroud)

返回:

Value
Version 
Other1   1
Other2   2
Top1     19
Top2     13
Run Code Online (Sandbox Code Playgroud)

我在找

Value
Version 
Others   
Top1     19
Top2     13
Run Code Online (Sandbox Code Playgroud)

仅为示例选择版本名称Other*和Top*.

当然,这可以通过在分组之后手动将类别设置为"其他"并与阈值进行比较来实现.我希望有一条捷径.

Rut*_*ies 6

我假设你也希望对这个Other组进行求和,你的例子总共为3个?

如果我的目标是赢得熊猫单线竞赛,这将是我的参赛作品:

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

         Value
Version       
Other        3
Top1        19
Top2        13
Run Code Online (Sandbox Code Playgroud)

但那是完全不可读的,所以让我们分解一下:

您已经展示了如何对每个组进行求和,对此结果进行排序并选择前2个之外的任何内容都可以通过以下方式完成:

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

在这个例子中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
Run Code Online (Sandbox Code Playgroud)

以上内容替换了not_top2任何列中的内容.如果您希望此值出现在任何其他列中,则需要一个小子步骤Version.

剩下的就是再次进行原始分组:

dfnew.groupby('Version').sum()
Run Code Online (Sandbox Code Playgroud)

这使:

         Value
Version       
Other        3
Top1        19
Top2        13
Run Code Online (Sandbox Code Playgroud)