Skip to main content
 首页 » 编程设计

python之按最小值对行进行分组

2025年05月04日9kenshinobiy

问题是我要构建一些表,而一些值低于特定阈值。例如:

    S1  S2  S3 
A   700 367 751 
B   354 103 143 
C   18  7   6 
D   27  11  5 
E   3   6   1 
F   8   2   9 
G   1   3   2 

我希望保留值包含至少一个值等于或大于 10 的行,并合并值小于 10 的行以创建名为 "Other (<10)" 的行:

1 - 表格的一部分,其行至少有一个单元格包含一个大于 10 的值(C 行;值 18):

    S1  S2  S3 
A   700 367 751 
B   354 103 143 
C   18  7   6 

2 - 任何值大于 10 的表格部分。

E   3   6   1 
F   8   2   9 
G   1   3   2 

最终表格的最后一行是 E、F 和 G 列的总和,包括“Other(>10)”行名称。像这样:

            S1  S2  S3 
A           700 367 751 
B           354 103 143 
C           18  7   6 
D           27  11  5 
Other(<10)  12  11  12 

请您参考如下方法:

如果您对 R 解决方案感兴趣:

filtered.df <-   rbind( df[ apply(df, 1, function(x){any(x>=10)}), ], 
               colSums( df[ apply(df, 1, function(x){all(x< 10)}), ])) 

这将是输出:

> filtered.df 
 
#      [,1] [,2] [,3]  
# [1,]  700  367  751  
# [2,]  354  103  143  
# [3,]   18    7    6  
# [4,]   27   11    5  
# [5,]   12   11   12 

数据:

df <- structure(c(700, 354, 18, 27, 3, 8, 1, 367, 103, 7, 11, 6, 2, 3, 751, 143, 6, 5, 1, 9, 2), .Dim = c(7L, 3L)) 

更新:包括列名和行名:


正如 OP 所要求的,对于列名和行名,这将是数据:

 df <- structure(c(700, 354, 18, 27, 3, 8, 1, 367, 103, 7, 11, 6, 2, 3, 751, 143, 6, 5, 1, 9, 2), .Dim = c(7L, 3L), .Dimnames = list(    c("A", "B", "C", "D", "E", "F", "G"), c("s1", "s2", "s3"))) 

然后使用上面相同的解决方案我们将得到:

> filtered.df 
 
#    s1  s2  s3  
# A 700 367 751  
# B 354 103 143  
# C  18   7   6  
# D  27  11   5  
#    12  11  12