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