过滤,分组d

2024-09-25 00:24:41 发布

您现在位置:Python中文网/ 问答频道 /正文

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过滤数据的方法,但在prot的pep超过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()))

Tags: 数据方法lambdagt情况sdpepxxx
1条回答
网友
1楼 · 发布于 2024-09-25 00:24:41

我很想一次就做到:

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。你知道吗


filtering data by prot and pep but keeping only pep where there is more than 1 pep for prot

使用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

filter again so for every pep values only 2 with the highest SD remain (and sum these two / divide by 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

我认为我们可以同意,最重要的方法更清晰(更有效!)。你知道吗

相关问题 更多 >