ВПР между 2 фреймами данных Pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть 2 фрейма данных pandas следующим образом.

DF1:

 Security     ISIN
ABC           I1 
DEF           I2
JHK           I3
LMN           I4
OPQ           I5
  

и DF2:

 ISIN      Value
 I2        100
 I3        200
 I5        300
  

Я хотел бы, чтобы в итоге третий фрейм данных выглядел следующим образом:

DF3:

 Security   Value
 DEF       100
 JHK       200
 OPQ       300
  

Ответ №1:

Вы можете использовать merge , по умолчанию inner join , так how=inner же как и omit, и если в обоих есть только один общий столбец Dataframes , вы также можете опустить параметр on='ISIN' :

 df3 = pd.merge(df1, df2)
#remove column ISIN
df3.drop('ISIN', axis=1, inplace=True)
print (df3)
  Security  Value
0      DEF    100
1      JHK    200
2      OPQ    300
  

Или map столбец ISIN по Series из df1 :

 print (df1.set_index('ISIN')['Security'])
ISIN
I1    ABC
I2    DEF
I3    JHK
I4    LMN
I5    OPQ
Name: Security, dtype: object

#create new df by copy of df2
df3 = df2.copy()
df3['Security'] = df3.ISIN.map(df1.set_index('ISIN')['Security'])
#remove column ISIN
df3.drop('ISIN', axis=1, inplace=True)
#change order of columns
df3 = df3[['Security','Value']]
print (df3)
  Security  Value
0      DEF    100
1      JHK    200
2      OPQ    300
  

Комментарии:

1. еще раз спасибо Джазраил. Это было чрезвычайно полезно. Теперь, если я не слишком нахален, опять же, мой результирующий DF имеет столбцы дерева, а последние 2 имеют только следующие значения:

Ответ №2:

Вы можете использовать pd.merge для автоматического выполнения внутреннего соединения ISIN . Следующая строка кода должна заставить вас работать:

 df3 = pd.merge(df1, df2)[['Security', 'Value']]
  

Что приводит к df3 :

   Security  Value
0      DEF    100
1      JHK    200
2      OPQ    300
  

Полностью воспроизводимый пример кода выглядит следующим образом:

 import pandas as pd

df1 = pd.DataFrame({
        'Security': ['ABC', 'DEF', 'JHK', 'LMN', 'OPQ'],
        'ISIN' : ['I1', 'I2', 'I3', 'I4', 'I5']
    })
df2 = pd.DataFrame({
        'Value': [100, 200, 300],
        'ISIN' : ['I2', 'I3', 'I5']
    })

df3 = pd.merge(df1, df2)[['Security', 'Value']]
print(df3)