ошибка при попытке слияния по индексу на питоне - PullRequest
2 голосов
/ 09 июля 2019

Я пытаюсь объединить два panda data.frames по индексу, но получаю пустой data.frame.

Я следую решениям, опубликованным по этой ссылке Python Dataframes не объединяются по индексу

, но это не работает,

Это мои два фрейма данных

>>>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)

Но это не работает, когда я указал 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 голосов
/ 10 июля 2019

Хорошо, я постараюсь собрать ответ.

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, и все столбцы из них обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...