Pandas: Как объединить два фрейма данных и заполнить значения NaN, используя значения из второго фрейма данных - PullRequest
2 голосов
/ 19 апреля 2020

У меня есть pandas фрейм данных (df1), который выглядит так:

No     car          pl.       Value      Expected      
1      Toyota       HK        0.1        0.12      
1      Toyota       NY        0.2        NaN     
2      Saab         LOS       0.3        NaN      
2      Saab         UK        0.4        0.6       
2      Saab         HK        0.5        0.51     
3      Audi         NYU       0.6        NaN      
3      Audi         LOS       0.7        NaN      
4      VW           UK        0.8        NaN   
5      Audi         HK        0.9        NaN    

И у меня есть еще один фрейм данных (df2), который выглядит так:

No        pl.             Expected              
2         LOS              0.35      
3         NYU              0.62   
3         LOS              0.76    
5         HK               0.91     

I хотел бы, чтобы мой окончательный кадр данных выглядел так:

No     car          pl.       Value      Expected      
1      Toyota       HK        0.1        0.12      
1      Toyota       NY        0.2        NaN     
2      Saab         LOS       0.3        0.35      
2      Saab         UK        0.4        0.6       
2      Saab         HK        0.5        0.51     
3      Audi         NYU       0.6        0.62      
3      Audi         LOS       0.7        0.76      
4      VW           UK        0.8        NaN   
5      Audi         HK        0.9        0.91    

Я пробовал это:

df = df1.fillna(df1.merge(df2, on=['No','pl.']))

Но df1 остается неизменным в выводе

Вопросы, которые у меня есть видели здесь были кадры с одинаковой формой. Есть ли способ сделать это, когда формы разные?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 19 апреля 2020

Поскольку у нас есть два ключевых столбца, в которых мы хотим сопоставить и обновить наш df1 фрейм данных, мы можем использовать set_index с fillna, поскольку fillna выравнивается в индексах:

keys = ['No', 'pl.']
df1 = df1.set_index(keys).fillna(df2.set_index(keys)).reset_index()

   No  pl.     car  Value  Expected
0   1   HK  Toyota    0.1      0.12
1   1   NY  Toyota    0.2       NaN
2   2  LOS    Saab    0.3      0.35
3   2   UK    Saab    0.4      0.60
4   2   HK    Saab    0.5      0.51
5   3  NYU    Audi    0.6      0.62
6   3  LOS    Audi    0.7      0.76
7   4   UK      VW    0.8       NaN
8   5   HK    Audi    0.9      0.91

Или мы можем использовать специальный метод Series.update для этого:

df1 = df1.set_index(keys)
df1['Expected'].update(df2.set_index(keys)['Expected'])
df1 = df1.reset_index()

   No  pl.     car  Value  Expected
0   1   HK  Toyota    0.1      0.12
1   1   NY  Toyota    0.2       NaN
2   2  LOS    Saab    0.3      0.35
3   2   UK    Saab    0.4      0.60
4   2   HK    Saab    0.5      0.51
5   3  NYU    Audi    0.6      0.62
6   3  LOS    Audi    0.7      0.76
7   4   UK      VW    0.8       NaN
8   5   HK    Audi    0.9      0.91
1 голос
/ 19 апреля 2020

Используйте левое соединение с параметром suffixes, а затем замените отсутствующие значения на Series.fillna на DataFrame.pop для использования и удалите столбец Expected_:

df = df1.merge(df2, on=['No','pl.'], how='left', suffixes=('_',''))
df['Expected'] = df.pop('Expected_').fillna(df['Expected'])
print (df)
   No     car  pl.  Value  Expected
0   1  Toyota   HK    0.1      0.12
1   1  Toyota   NY    0.2       NaN
2   2    Saab  LOS    0.3      0.35
3   2    Saab   UK    0.4      0.60
4   2    Saab   HK    0.5      0.51
5   3    Audi  NYU    0.6      0.62
6   3    Audi  LOS    0.7      0.76
7   4      VW   UK    0.8       NaN
8   5    Audi   HK    0.9      0.91
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...