Видя, что мой комментарий выше действительно помог кому-то решить проблему, я отправлю ее в качестве ответа.
Проблема возникает, если вы переключитесь с %matplotlib inline
на %matplotlib notebook
без перезапуска ядра.
Переключение с %matplotlib notebook
на %matplotlib inline
работает нормально.
Итак, решение состоит в том, чтобы либо перезапустить ядро, либо запустить новый ноутбук.
Кажется, что в некоторых случаях это помогает повторить настройку backend ноутбука, то есть вызвать его дважды например
%matplotlib notebook
%matplotlib notebook
Thyere - проблема в том, что ваш столбец id
в одном df есть object
(очевидно string
) и другой int
, поэтому нет соответствия и получить NaN
.
Если имеют одинаковые dtypes
:
print (df1['id'].dtypes)
int64
print (df2['id'].dtypes)
int64
merged = pd.merge(df1, df2, how="left", on="id")
print (merged)
Date id Market_Cap Ticker
0 2000 1 400 Shell
1 2000 2 200 ExxonMobil
2 2001 1 410 Shell
3 2001 2 220 ExxonMobil
Другим решением, если нужно добавить только один новый столбец, является map
:
df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
print (df1)
Date id Market_Cap Ticker
0 2000 1 400 Shell
1 2000 2 200 ExxonMobil
2 2001 1 410 Shell
3 2001 2 220 ExxonMobil
Имитация вашей проблемы:
print (df1['id'].dtypes)
object
print (df2['id'].dtypes)
int64
df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
print (df1)
Date id Market_Cap Ticker
0 2000 1 400 NaN
1 2000 2 200 NaN
2 2001 1 410 NaN
3 2001 2 220 NaN
И решение преобразуется в int
в astype
(или в столбце id
в df2
до str
):
df1['id'] = df1['id'].astype(int)
#alternatively
#df2['id'] = df2['id'].astype(str)
df1['Ticker'] = df1['id'].map(df2.set_index('id')['Ticker'])
print (df1)
Date id Market_Cap Ticker
0 2000 1 400 Shell
1 2000 2 200 ExxonMobil
2 2001 1 410 Shell
3 2001 2 220 ExxonMobil