Python 按最小值分组行

Python 按最小值分组行,python,r,dataframe,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)”的行名。像这样: S1 S2 S3 A 700 367

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

    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)”的行名。像这样:

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

其他(您可以在python中尝试:

data = ["700 367 751", "354 103 143", "18  7   6", "27  11  5", "3   6   1", "8   2   9", "1   3   2"]

new_data = [map(int, i.split()) for i in data]

final_data = []

extra_data = [0, 0, 0]

for i in new_data:
   if any(b >= 10 for b in i):
        final_data.append(i)

   else:
       extra_data = [extra_data[c]+b for c, b in enumerate(i)]

final_data.append(extra_data)

print final_data

您可以在python中尝试以下操作:

data = ["700 367 751", "354 103 143", "18  7   6", "27  11  5", "3   6   1", "8   2   9", "1   3   2"]

new_data = [map(int, i.split()) for i in data]

final_data = []

extra_data = [0, 0, 0]

for i in new_data:
   if any(b >= 10 for b in i):
        final_data.append(i)

   else:
       extra_data = [extra_data[c]+b for c, b in enumerate(i)]

final_data.append(extra_data)

print final_data

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

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

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))

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

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

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))

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
ind 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

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
ind 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

解决方案可能以
apply(df,1,max)
filtered.df 10)}开头。]
这将为您提供第一部分。然后你可以把小于10的加起来。@G5W或者只加df.max(1)@EFT我不知道那个函数-我的R副本也不知道。@EFT那是python都德。另外,我的函数应该是
any
而不是
all
\n解决方案可以从
apply(df,1,max)
filtered.df 10)}开始。]
这将为您提供第一部分。然后你可以把小于10的加起来。@G5W或者只加df.max(1)@EFT我不知道那个函数-我的R副本也不知道。@EFT那是python都德。另外,我的函数应该是
any
,而不是
all
\Nice且简洁!@Masoud确实如此,但它消除了标题和行名。保留它们并创造“另一个”会很有趣(@FelipeLira No.我只是在结构化数据中没有列名。它根本不会影响行名或列名。好的,@Masoud.我将尝试在df示例中包含行名,以检查并进一步尝试使用我的数据。@FelipeLira Idk您的意思。这是我表示data.frame的一种方式。
row.names
col.names
返回行名和列名。在这里,我是第一次定义它们。如果您有data.frame(我认为您应该这样做,这就是您的示例),您不需要这样做。只需将解决方案应用于data.frame.Nice和construct!这是正确的@Masoud,但它消除了标题和行名称。保留它们并创建“其他”会很有趣(@FelipeLira No.我只是在结构化数据中没有列名。它根本不会影响行名或列名。好的,@Masoud.我将尝试在df示例中包含行名,以检查并进一步尝试使用我的数据。@FelipeLira Idk您的意思。这是我表示data.frame的一种方式。
row.names
col.names
返回行名和列名。在这里,我是第一次定义它们。如果您有data.frame(我认为您应该这样做,这是您的示例),您不需要创建它。只需在data.frame上应用解决方案即可。
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