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

2024-10-02 08:15:08 发布

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

我有一个不同基因位置的数据表。位置用三元组表示(‘染色体’,‘srand’,position),我已经把它变成了一个多索引。我的目标是查找每个位置的各种信息并将其添加到表中(例如基因名等),我可以使用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

我的问题是向具有多索引的数据框添加列。如果没有多索引,pandas - add new column to dataframe from dictionary

我有一个查找信息的字典,它有对应于多索引的三元组键。如何将此数据添加为新列?在

^{pr2}$

我试过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

Tags: 数据frompos信息dfindex基因range
3条回答

将gene_d制作成一个数据帧:

df1 = pd.DataFrame.from_dict(gene_d, orient='index').rename(columns={0:'gene'})

给它一个多重指数:

^{pr2}$

与原始数据框连接:

new_df = pd.concat([df, df1], axis=1).sort_values('A')

清理一下:

new_df.index.rename(['chrom','strand','abs_pos'], inplace=True)
new_df.set_index('gene', append=True)
new_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

这是一个很直接的循环。注意,如果要循环,那么dict可能不是合适的数据结构,可能只是元组的列表?在

In [14]: for k, v in gene_d.items():
    ...:     df.loc[k,'gene'] = v
    ...:

In [15]: df
Out[15]:
                       A  B  C   gene
chrom  strand abs_pos
chrom1 -      1234     1  1  1  geneA
       +      5678     2  2  2  geneB
              9876     3  3  3  geneC
chrom2 +      13579    4  4  4  geneD
              8497     5  5  5  geneE
       -      98765    6  6  6  geneF
              76856    7  7  7  geneG

In [16]:

矢量化方法:

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

结果df:

^{pr2}$

相关问题 更多 >

    热门问题