按数据子集查找列的最大值

时间:2018-02-27 02:10:33

标签: python sql r sas max

我有以下数据集,并希望通过子集找到最大值 数据集

StudentID Indicator Value  
100 N 30  
100 N 35  
100 N 28  
100 Y 20  
100 N 29  
100 N 60  
200 N 40  
200 N 35  
200 Y 20  
200 N 24  
200 N 35  

我希望结果如下:
结果

StudentID Indicator Value Max  
100 N 30 35  
100 N 35 35  
100 N 28 35  
100 N 29 60   
100 N 60 60  
200 N 40 40  
200 N 35 40  
200 N 24 35  
200 N 35 35  

基本上,每当指标从N变为Y时,我需要将studentID和IndicatorID的行视为一个块,并计算该块的最大值并继续下一次迭代。

2 个答案:

答案 0 :(得分:1)

以下是pandas使用python的选项。我们通过获取逻辑输出(dat.Indicator == "Y"的累积总和来创建分组变量,然后通过删除'Indicator'为“Y”的行来对行进行子集,按“StudentID”,“Group”分组,得到max的“{值”transform,将其分配给“值”,将drop列为不需要的列

dat['Group'] = (dat.Indicator == "Y").cumsum()

datS = dat[dat.Indicator != "Y"]
datS1 = datS.copy()
datS1['Value'] = datS.groupby(['StudentID', 'Group'])['Value'].transform('max')
datS1.drop('Group', axis = 1, inplace = True)
datS1

-output

enter image description here

base R选项为ave

dat$Value <- with(dat, ave(Value, cumsum(Indicator == "Y"), FUN = max))
subset(dat, Indicator != "Y")
#    StudentID Indicator Value
#1        100         N    35
#2        100         N    35
#3        100         N    35
#5        100         N    60
#6        100         N    60
#7        200         N    60
#8        200         N    60
#10       200         N    35
#11       200         N    35

数据

import pandas as pd
dat = pd.DataFrame({'StudentID': [100, 100, 100, 100, 100, 100, 200, 200, 200, 200, 200],
               'Indicator':[ "N", "N", "N", "Y", "N", "N", "N", "N", "Y", "N", "N"],
               'Value':[30, 35, 28, 20, 29, 60, 40, 35, 20, 24, 35]})

#R
dat <-structure(list(StudentID = c(100L, 100L, 100L, 100L, 100L, 100L, 
 200L, 200L, 200L, 200L, 200L), Indicator = c("N", "N", "N", "Y", 
"N", "N", "N", "N", "Y", "N", "N"), Value = c(35L, 35L, 35L, 
60L, 60L, 60L, 60L, 60L, 35L, 35L, 35L)), .Names = c("StudentID", 
 "Indicator", "Value"), row.names = c(NA, -11L), class = "data.frame")

答案 1 :(得分:0)

您缺少一个表示组的变量。您可以使用notsorted语句中的by选项在SAS中轻松完成此操作。

data grouped ;
  retain group 0;
  set have ;
  by studentid indicator notsorted;
  group + first.indicator;
run;

现在有很多方法可以按组生成平均值,因为它们已定义。 PROC SQL可以自动将聚合值重新合并到细节线上,从而轻松实现。

proc sql ;
 select *,max(value) as max
   from grouped
   group by group
 ;
quit;

结果:

group  StudentID  Indicator     Value       max

   1        100  N                35        35
   1        100  N                30        35
   1        100  N                28        35
   2        100  Y                20        20
   3        100  N                60        60
   3        100  N                29        60
   4        200  N                40        40
   4        200  N                35        40
   5        200  Y                20        20
   6        200  N                35        35
   6        200  N                24        35

我不确定为什么您的示例输出已删除了具有INDICATOR ='Y'的组,但您只需添加where子句即可将其删除。