2016-12-05 2 views
3

У меня есть dataframe df_in вот так:Отображение значения индекса от одного dataframe к другому в панд

import pandas as pd 
import numpy as np 
dic_in = {'A':['A1','A1','A1','L3','A3','A3','B1','B1','B1','B2','A2'], 
     'B':['xxx','ttt','qqq','nnn','lll','nnn','eee','xxx','qqq','bbb','sss'], 
     'C':['fas','efe','pfo','scs','grj','rpo','cbb','asf','asc','wq3','mls']} 
df_in = pd.DataFrame(dic_in) 

У меня также есть еще один dataframe, который называется df_map:

dic_map = {'X':['A1' ,'A1' ,'A1' ,'A2' ,'A3' ,'B1' ,'B1' ,'B1' ,'B1' ,'B2' ,'B3' ,'B3' ,'L1', 'L3' ,'L3'], 
      'Y':['qqq','ttt','xxx','sss','lll','eee','qqq','xxx','zzz','bbb','mmm','ooo','kkk','nnn','ttt']} 
df_map = pd.DataFrame(dic_map) 

Моя цель заключается в изучать каждый row[['A','B']] от df_in; если пара элементов идентифицирована в пределах df_map, тогда я извлекаю значение соответствующего индекса, и я устанавливаю его в другой столбец в первом фрейме данных.

Ex: пара A1 - xxx находится на карте в 0; поэтому я поставлю 0 рядом с парой A1 - xxx. Если пара не найдена, я поместил NaN.

Результат должен выглядеть следующим образом:

Idx A B C 
0  2 A1 xxx fas 
1  1 A1 ttt efe 
2  0 A1 qqq pfo 
3 13 L3 nnn scs 
4  4 A3 lll grj 
5 NaN A3 nnn rpo 
6  5 B1 eee cbb 
7  7 B1 xxx asf 
8  6 B1 qqq asc 
9  9 B2 bbb wq3 
10 3 A2 sss mls 

Можете ли вы предложить мне умный и эффективный способ для достижения своей цели?

ответ

3

Вы можете использовать merge с reset_index, последний удалить столбцы drop:

print (pd.merge(df_in, 
       df_map.reset_index(), 
       left_on=['A','B'], 
       right_on=['X','Y'], 
       how='left').drop(['X','Y'], axis=1)) 

    A B C index 
0 A1 xxx fas 2.0 
1 A1 ttt efe 1.0 
2 A1 qqq pfo 0.0 
3 L3 nnn scs 13.0 
4 A3 lll grj 4.0 
5 A3 nnn rpo NaN 
6 B1 eee cbb 5.0 
7 B1 xxx asf 7.0 
8 B1 qqq asc 6.0 
9 B2 bbb wq3 9.0 
10 A2 sss mls 3.0 

Другое решение, спасибо Julien Marrec:

df_in.merge(df_map.reset_index() 
        .set_index(['X','Y']), 
      left_on=['A','B'], 
      right_index=True, 
      how='left') 

Последний, если хотите изменить порядок столбцов:

df = pd.merge(df_in, 
       df_map.reset_index(), 
       left_on=['A','B'], 
       right_on=['X','Y'], 
       how='left').drop(['X','Y'], axis=1) 
cols = df.columns[-1:].tolist() + df.columns[:-1].tolist() 
print (cols) 
['index', 'A', 'B', 'C'] 

df = df[cols] 
print (df) 
    index A B C 
0  2.0 A1 xxx fas 
1  1.0 A1 ttt efe 
2  0.0 A1 qqq pfo 
3 13.0 L3 nnn scs 
4  4.0 A3 lll grj 
5  NaN A3 nnn rpo 
6  5.0 B1 eee cbb 
7  7.0 B1 xxx asf 
8  6.0 B1 qqq asc 
9  9.0 B2 bbb wq3 
10 3.0 A2 sss mls 
+1

Вы избили меня до него, я придумал 'df_in.merge (df_map.reset_index(). Set_index (['X', 'Y']), left_on = ['A', 'B'], right_index = True, how = 'left') ' –

+0

Что делать, если я хочу переместить индекс на 1 во время операции таким образом, что значения отображаемых индексов все +1? –

+0

Сдвиг индекса, вы имеете в виду после слияния, 'df ['index'] + = 1'? –

Смежные вопросы