如果两个值具有相同符号,则查找数据帧中后续行的平均值

2024-10-03 06:19:29 发布

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

我有一个有4列的数据框('string1','float1','float2','string2')。'string1'列在连续的行中有重复的值。我需要按每个元素遍历“float1”列(即float),并检查它前面是否有+/-运算符。如果运算符与“string1”的相同值不同,则将删除整行,否则,查找“float1”、“float2”的平均值,并将“string2”中的字符串值加上“|”,并且“string1”保持不变。你知道吗

数据框如下所示:

symbol     logFC     adj.P.Val      ID
A2M     -1.0912438  0.02647898  217757_at
A2M-AS1 -0.8953089  0.01443973  1564139_at
A4GALT  -1.3640826  0.02797254  219488_at
AATBC   -2.2205471  0.00654647  205969_at
AATBC    1.3869134  0.00874959  1563088_a_at
ABCA17P  2.3007386  0.04703096  231164_at
ABCA6   -2.1360694  0.02161093  0082_at
ABCA6   -1.1171276  0.03133593  7504_at
ABCA6   -1.8703369  0.01409799  4719_at

我试过为每个条目运行for循环,但是它非常耗时,并且给了我每个值的平均值

预期的数据帧应如下所示:

对于(符号中的AATBC),logFc具有(-2.2205471和1.3869134),因此这两行被删除,因为它们具有不同的运算符

对于(符号中的ABCA6),所有logFc都有相同的运算符,因此我们将在同一行中找到(logFc和adj p.value的)平均值并写入ID,如下所示

symbol     logFC     adj.P.Val      ID
A2M     -1.0912438  0.02647898  217757_at
A2M-AS1 -0.8953089  0.01443973  1564139_at
A4GALT  -1.3640826  0.02797254  219488_at
ABCA17P  2.3007386  0.04703096  231164_at
ABCA6   -1.7078446  0.02234828  0082_at | 7504_at | 4719_at

Tags: 数据id运算符symbolat平均值string1a2m
1条回答
网友
1楼 · 发布于 2024-10-03 06:19:29

使用where将具有相同符号的'symbols'子集。然后groupby+agg。这是因为groupby忽略以NaN作为键的行,这有效地从输出中删除了更改符号的组。你知道吗

import numpy as np

m = np.sign(df.logFC)  # can map `0` if you want to consider that + or -

(df.where(m.groupby(df.symbol).transform('nunique') == 1)
   .groupby('symbol')
   .agg({'logFC': 'mean', 'adj.P.Val': 'mean', 'ID': ' | '.join})
)

            logFC  adj.P.Val                           ID
symbol                                                   
A2M     -1.091244   0.026479                    217757_at
A2M-AS1 -0.895309   0.014440                   1564139_at
A4GALT  -1.364083   0.027973                    219488_at
ABCA17P  2.300739   0.047031                    231164_at
ABCA6   -1.707845   0.022348  0082_at | 7504_at | 4719_at

相关问题 更多 >