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