如果两个值具有相同的符号,则在熊猫数据框中查找后续行的均值

时间:2019-10-28 17:46:21

标签: python pandas dataframe mean

我有一个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

1 个答案:

答案 0 :(得分:2)

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