python - 如何使用 pandas 将 Top N 之外的 "remaining"结果分组为 "Others"

标签 python pandas

当按一列对 pandas 数据框进行分组时,说“版本”,它有 10 个不同的版本。如何绘制前 3 名(覆盖超过 90%)并将小的剩余部分放入一个“其他”桶中。

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* 只是为示例选择的。

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

最佳答案

我假设您还希望对 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

关于python - 如何使用 pandas 将 Top N 之外的 "remaining"结果分组为 "Others",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19835746/

相关文章:

NFA 的 Python 正则表达式

python - py2app 在使用 virtualenv 时没有将 Python.framework 复制到新应用程序

python - 从 pandas 数据框转换为 LabeledPoint RDD

pandas - 根据pandas中给定的特定条件从给定的日期创建year_category

python - 在 python pandas 数据框中查找一行值与剩余行值的差异

python - K 表示在大小不均匀的簇上进行聚类

python - 如何从 python 代码调用 shell 脚本?

python - 如何在 Pandas DATAFRAME 中查找列值具有特定数据类型的行

python - pandas 读取未分隔的文本文件到数据框

python - 如何在 'pandas' 中乘以 DataFrame?