尝试在python上按索引合并时发生错误

时间:2019-07-09 19:17:51

标签: python pandas

我正在尝试按索引合并两个panda data.frame,但是我得到一个空的data.frame。

我正在关注此链接Python Dataframes not merging on index

中发布的解决方案

但它不起作用

这是我的两个data.frames

>>>norm_df.head()
                    eQTL-103  eQTL-105  eQTL-106  eQTL-111  eQTL-112  \
transcript_id                                                          
ENST00000456328.2  -0.418029 -0.418029 -0.418029 -0.418029  0.733977   
ENST00000488147.1   0.330873 -1.786156  0.562062  0.023212  0.380326   
ENST00000466430.5   1.128144 -1.914506 -0.589456 -0.430727 -0.796183   
ENST00000442987.3   1.446104 -0.508488  0.895780  0.306454  0.828465   
ENST00000494149.2   0.674490 -1.085325 -0.828465  0.116309 -0.186756   

                    eQTL-115  eQTL-126  eQTL-127  eQTL-131  eQTL-133  \
transcript_id                                                          
ENST00000456328.2   1.786156 -0.418029  1.382994 -0.418029  0.861634   
ENST00000488147.1   1.005170 -1.044409 -1.515564  1.324958  0.000000   
ENST00000466430.5   0.282216 -1.593219  0.828465  0.589456  0.430727   
ENST00000442987.3  -0.931003  0.258143  0.535083  1.786156 -0.210428   
ENST00000494149.2  -0.562062  0.306454 -0.861634  0.282216  0.430727     

                   eQTL-80   eQTL-85   eQTL-87   eQTL-94   eQTL-96   eQTL-97  
transcript_id                                                                   
ENST00000456328.2  -0.418029 -0.418029  1.005170 -0.418029 -0.418029 -0.418029  
ENST00000488147.1  -0.967422 -0.482248 -0.764710  0.895780  0.116309 -0.931003  
ENST00000466430.5   0.508488  0.023212 -0.931003 -0.562062  0.861634 -1.382994  
ENST00000442987.3  -1.914506  0.380326 -0.482248 -0.116309  0.674490 -1.005170  
ENST00000494149.2  -1.515564 -0.430727 -0.023212  0.617300  0.186756 -0.046436  

[5 rows x 107 columns]

>>> bed_template_df.head()

                    chr  start    end      transcript_id
transcript_id                                           
ENST00000456328.2  chr1  11868  11869  ENST00000456328.2
ENST00000450305.2  chr1  12009  12010  ENST00000450305.2
ENST00000488147.1  chr1  29569  29570  ENST00000488147.1
ENST00000619216.1  chr1  17435  17436  ENST00000619216.1
ENST00000473358.1  chr1  29553  29554  ENST00000473358.1

我已经尝试过pd.merge

 bed_df = pd.merge(bed_template_df, norm_df, left_index=True, right_index=True)

但结果是一个空的data.frame

我试图为两个索引设置相同的类型

 norm_df.index = norm_df.index.astype(str)
 bed_template_df.index = bed_template_df.index(str)

但是它不起作用,当我在merge命令中指定how时,我得到了这个结果

>>> bed_df = pd.merge(bed_template_df, norm_df, left_index=True, right_index=True, how='right')

>>> bed_df.head()
                    chr  start  end transcript_id  eQTL-103  eQTL-105  
transcript_id                                                           
ENST00000456328.2   NaN    NaN  NaN           NaN -0.418029 -0.418029   
ENST00000488147.1   NaN    NaN  NaN           NaN  0.330873 -1.786156   
ENST00000466430.5   NaN    NaN  NaN           NaN  1.128144 -1.914506   
ENST00000442987.3   NaN    NaN  NaN           NaN  1.446104 -0.508488   
ENST00000494149.2   NaN    NaN  NaN           NaN  0.674490 -1.085325

似乎python找不到两个索引相等,但我可以看到ENST00000456328.2中的bed_template_df存在于norm_df

1 个答案:

答案 0 :(得分:0)

好的,我会尽力将答案汇总在一起。

1。查找两个数据框中共有的索引:

common_id = set(norm_df.index.values).intersection(set(bed_template_df.index.values))

2。合并数据框上的common_id:

final_df = pd.merge(bed_template_df[common_id], norm_df[common_id], left_index=True, right_index=True)

如果我理解正确,这应该可以工作。它为您提供了一个最终数据框,该数据框仅包含norm_df和bed_template_df共同的索引以及它们中的所有列。