按最小值对行进行分组

时间:2017-06-06 14:28:57

标签: python r dataframe

问题是我要构建一些表,并且某些值在特定阈值之下。例如:

    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的列的总和,包括&#34;其他(&gt; 10)&#34;行名称。像这样:

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

3 个答案:

答案 0 :(得分:4)

如果您对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

答案 1 :(得分:2)

你可以在python中试试这个:

np.split(...)

答案 2 :(得分:2)

R的矢量化选项是,

ind <- rowSums(df > 10) == 0

rbind(df[!ind,], colSums(df[ind,]))

#   S1  S2  S3
#A 700 367 751
#B 354 103 143
#C  18   7   6
#D  27  11   5
#   12  11  12