索引不匹配的数据帧之间的掩蔽

2024-10-02 20:40:31 发布

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

目标

在两个数据帧之间执行两个样本t检验的组合:设置真/假上下文的布尔矩阵和值矩阵。这种组合发生在不共享索引的行之间,我想不出如何将一个df中的一个索引的掩码应用于另一个df中不匹配的索引。你知道吗

示例

虚拟数据:

cnv = {'gene': ['a','b','c'],
        'cell_1': [0,-1,0],
        'cell_2': [0,-1,-1],
        'cell_3': [-1,0,-1],
        'cell_4': [-1,0,-1],
        'cell_5': [-1,0,0]
       }
cnvdf = pd.DataFrame(cnv)
cnvdf.set_index('gene', inplace=True)

cnv_mask = cnvdf < 0

rna = {'gene': ['x','y','z'],
        'cell_1': [1, 5, 8],
        'cell_2': [8, 5, 4],
        'cell_3': [8, 6, 1],
        'cell_4': [1, 2, 7],
        'cell_5': [5, 7, 9],
       }
rnadf_all = pd.DataFrame(rna)
rnadf_all.set_index('gene', inplace=True)

以下是两个dfs:

print(rnadf)
      cell_1  cell_2  cell_3  cell_4  cell_5
gene                                        
x          1       8       8       1       5
y          5       5       6       2       7
z          8       4       1       7       9

print(cnv_mask)
     cell_1 cell_2 cell_3 cell_4 cell_5
gene                                   
a     False  False   True   True   True
b      True   True  False  False  False
c     False   True   True   True  False

我希望实现的伪代码:

for rR in rnadf_all.iterrows():
        for cR in cnv_mask.iterrows():
            link = rR+"&"+cR
            rnaPos = rR[<True values from cR mask applied to rR>].dropna()
            rnaNeg = rR[<False values from cR mask applied to rR>].dropna()
            t, p = stats.ttest_ind(rnaPos, rnaNeg)

所需产品

如果您使用提供的答案运行上面的伪代码,并为每个迭代打印linkrnaPosrnaNeg值,那么这就是理想情况:

link   rnaPos   rnaNeg
x&a    [8,1,5]  [1,8]
x&b    [1,8]    [8,1,5]
x&c    [8,8,1]  [1,5]
y&a    [6,2,7]  [5,5]
y&b    [5,5]    [6,2,7]
...
...
...
z&c    [4,1,7]  [8,9]

以上是我正在寻找的模式。例如:z&c,将来自cnv_maskc的掩码应用于rnadf_allz,创建True[4,1,7],以及False[8,9]。因此,应用程序不是通过dfs之间的索引来匹配掩码,而是通过列对齐来匹配掩码。我该怎么做?你知道吗


Tags: falsetruerrlinkcellmaskallcr
1条回答
网友
1楼 · 发布于 2024-10-02 20:40:31
import itertools
for pr in itertools.product(rnadf_all.index, cnv_mask.index):
    print('&'.join(pr), rnadf_all.loc[pr[0]][cnv_mask.loc[pr[1]]].tolist(),
          rnadf_all.loc[pr[0]][~cnv_mask.loc[pr[1]]].tolist())

x&a [8, 1, 5] [1, 8]
x&b [1, 8] [8, 1, 5]
x&c [8, 8, 1] [1, 5]
y&a [6, 2, 7] [5, 5]
y&b [5, 5] [6, 2, 7]
y&c [5, 6, 2] [5, 7]
z&a [1, 7, 9] [8, 4]
z&b [8, 4] [1, 7, 9]
z&c [4, 1, 7] [8, 9]

你知道吗itertools.产品提供所有可能的产品。对于它们中的每一个,rnadf_all.loc[pr[0]][cnv_mask.loc[pr[1]]].tolist()转到rnadf_all中相应的行,并根据cnv_mask中相应行的真值对其进行切片。对于假值,只需要在cnv_mask前面加一个波浪号。你知道吗

相关问题 更多 >