聚合行对组合并使用Pandas计算差异

mlmc2os5  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(90)

我在这里使用这个问题的上下文和代码:Aggregate all dataframe row pair combinations using pandas

import pandas
import itertools

mygenes=['ABC1', 'ABC2', 'ABC3', 'ABC4']

df = pandas.DataFrame({'Gene' : ['ABC1', 'ABC2', 'ABC3', 'ABC4','ABC5'],
                       'case1'   : [0,1,1,0,0],
                       'case2'   : [1,1,1,0,1],
                       'control1':[0,0,1,1,1],
                       'control2':[1,0,0,1,0] })
>>> df
   Gene  case1  case2  control1  control2
0  ABC1      0      1         0         1
1  ABC2      1      1         0         0
2  ABC3      1      1         1         0
3  ABC4      0      0         1         1
4  ABC5      0      1         1         0

下面的解决方案对行求和,但是,在我的情况下,我需要差值。

>>> df = df.set_index("Gene")
>>> cc = list(combinations(mygenes,2))
>>> out = pd.DataFrame([df.loc[c,:].sum() for c in cc], index=cc)
>>> out
              case1  case2  control1  control2
(ABC1, ABC2)      1      2         0         1
(ABC1, ABC3)      1      2         1         1
(ABC1, ABC4)      0      1         1         2
(ABC2, ABC3)      2      2         1         0
(ABC2, ABC4)      1      1         1         1
(ABC3, ABC4)      1      1         2         1

所以在我的例子中,(ABC1,ABC2)会产生[-1,0,0,1]
不幸的是,使用. diff()而不是. sum()会导致以下错误消息:

    • 数值错误:必须传递二维输入。形状=(10,2,8)**
8ljdwjyq

8ljdwjyq1#

了解一下.sum().diff()的功能可能会有所帮助
.sum()生成一个系列

>>> df.loc[cc[0], :].sum()
case1       1
case2       2
control1    0
control2    1
dtype: int64

.diff()生成一个 Dataframe

>>> df.loc[cc[0], :].diff()
      case1  case2  control1  control2
Gene                                  
ABC1    NaN    NaN       NaN       NaN
ABC2    1.0    0.0       0.0      -1.0

您可以将句点-1与diff一起使用,然后为生成的DataFrame的第一行建立索引
一个二个一个一个

nxowjjhe

nxowjjhe2#

另一种可能的解决方案:

out = pd.DataFrame(
    [[x, (df.loc[df.Gene.eq(x[0]), 'case1':].to_numpy() - 
          df.loc[df.Gene.eq(x[1]), 'case1':].to_numpy())
      .flatten().tolist()] 
     for x in combinations(mygenes, 2)])
out = (pd.concat([out.loc[:,0], pd.DataFrame(out[1].to_list())], axis=1)
       .set_axis(df.columns, axis=1))

输出:

Gene  case1  case2  control1  control2
0  (ABC1, ABC2)     -1      0         0         1
1  (ABC1, ABC3)     -1      0        -1         1
2  (ABC1, ABC4)      0      1        -1         0
3  (ABC2, ABC3)      0      0        -1         0
4  (ABC2, ABC4)      1      1        -1        -1
5  (ABC3, ABC4)      1      1         0        -1

相关问题