如何在pandas中使用带有多索引的地图?

Hik*_*erT 13 python multi-index pandas

我有各种基因组位置的数据数据表.这些位置表示为3元组('染色体','srand',位置),我已经变成了多指数.我的目标是查找有关每个位置的各种信息并将其添加到表中(例如基因名称等)我可以使用pybedtools执行此操作.

df = pd.DataFrame(data={'A':range(1,8), 'B':range(1,8), 'C': range(1,8)},
 index=pd.MultiIndex.from_tuples([('chrom1', '-', 1234), ('chrom1', '+', 5678),
 ('chrom1', '+', 9876),  ('chrom2', '+', 13579), ('chrom2', '+', 8497), ('chrom2', '-', 98765),
 ('chrom2', '-', 76856)]))

df.index.rename(['chrom','strand','abs_pos'], inplace=True)

                       A  B  C
chrom  strand abs_pos         
chrom1 -      1234     1  1  1
       +      5678     2  2  2
              9876     3  3  3
chrom2 +      13579    4  4  4
              8497     5  5  5
       -      98765    6  6  6
              76856    7  7  7
Run Code Online (Sandbox Code Playgroud)

我的问题是向具有多索引的数据框添加列.这似乎很简单,没有多索引:pandas - 从字典向数据框添加新列

我有一个查找信息的字典,其中包含与多索引相对应的3元组键.如何将此数据添加为新列?

gene_d = {('chrom1', '-', 1234) : 'geneA', ('chrom1', '+', 5678): 'geneB', 
    ('chrom1', '+', 9876): 'geneC', ('chrom2', '+', 13579): 'geneD',
    ('chrom2', '+', 8497): 'geneE', ('chrom2', '-', 98765): 'geneF', 
    ('chrom2', '-', 76856): 'geneG'}
Run Code Online (Sandbox Code Playgroud)

我已经尝试过map,但似乎无法弄清楚如何使用多索引来生成以下内容:

                                A  B  C
chrom  strand abs_pos gene
chrom1 -      1234    geneA     1  1  1
       +      5678    geneB     2  2  2
              9876    geneC     3  3  3
chrom2 +      13579   geneD     4  4  4
              8497    geneE     5  5  5
       -      98765   geneF     6  6  6
              76856   geneG     7  7  7
Run Code Online (Sandbox Code Playgroud)

Vai*_*ali 10

矢量化方法:

df['gene'] = df.index #you get the index as tuple
df['gene'] = df['gene'].map(gene_d)
df = df.set_index('gene', append=True)
Run Code Online (Sandbox Code Playgroud)

结果df:

                                A   B   C
chrom   strand  abs_pos gene            
chrom1  -       1234    geneA   1   1   1
        +       5678    geneB   2   2   2
                9876    geneC   3   3   3
chrom2  +       13579   geneD   4   4   4
                8497    geneE   5   5   5
        -       98765   geneF   6   6   6
                76856   geneG   7   7   7
Run Code Online (Sandbox Code Playgroud)