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()))
答案 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
我认为我们可以同意顶级方法更清晰(更高效!)。