过滤,分组数据

时间:2015-04-15 20:47:59

标签: python pandas

PROT      PEP       SD  
1        XXX      4,54             
1        XXX      5,56             
1        XXY      4,67                       
1        XXZ      5,67             
1        XXY      5,67  
1        XXX      5,68          
2        XXW      4,64             
2        XXZ      4,54             
2        XXW      5,56             
2        XXX      4,67                        
2        XXX      5,67  

我需要找出一种通过prot和pep过滤数据的方法,但只保留pep,其中prot超过1 pep - >然后再次过滤,这样每个pep值只有2,最高SD仍然存在(并将这两个相加/除以2)

PROT1的输出:

PROT    PEP   SD
1       XXX   5.56+5.68 /2
        XXY   4.67 + 5.67 /2

我认为如果我弄清楚在lambda x之后要放什么,这可能就是这样:所以它需要三个最高值,现在它给了我一个最高价值指数。

counts = (df6.groupby(['PROT','PEP])['SD']
        .apply(lambda x: x.idxmax()))

1 个答案:

答案 0 :(得分:2)

我很想一次性做到这一点:

In [11]: g = df.groupby(['PROT', 'PEP'])

In [12]: g['SD'].apply(lambda x: np.nan if len(x) < 2 else (x.nlargest(2).sum() / 2))
Out[12]:
PROT  PEP
1     XXX    5.62
      XXY    5.17
      XXZ     NaN
2     XXW    5.10
      XXX    5.17
      XXZ     NaN
Name: SD, dtype: float64

然后放下NaN。


  

通过prot和pep过滤数据,但只保留pep,其中prot超过1 pep

使用groupby过滤器:

In [21]: g = df.groupby(['PROT', 'PEP'])

In [22]: g.filter(lambda x: len(x) >= 2)
Out[22]:
    PROT  PEP    SD
0      1  XXX  4.54
1      1  XXX  5.56
2      1  XXY  4.67
4      1  XXY  5.67
5      1  XXX  5.68
6      2  XXW  4.64
8      2  XXW  5.56
9      2  XXX  4.67
10     2  XXX  5.67
  

再次过滤,因此对于每个pep值只有2,最高SD仍然存在(并将这两个相加/除以2)

你可以在第二遍使用nlargest(但这开始变得混乱)。

In [31]: (g.filter(lambda x: len(x) >= 2)
           .groupby(['PROT', 'PEP'])['SD']
           .nlargest(2)
           .groupby(level=[0, 1])
           .sum() / 2)
Out[31]:
PROT  PEP
1     XXX    5.62
      XXY    5.17
2     XXW    5.10
      XXX    5.17
dtype: float64

我认为我们可以同意顶级方法更清晰(更高效!)。