как мне «обновить» df на основе значений другого фрейма данных, который использует общий ключ? питон

#python #pandas

#python #pandas

Вопрос:

как мне «обновить» a12 на основе значений другого фрейма данных, который использует общий ключ? В приведенном ниже примере общим ключом является столбец a.

a12 =

   a  b  c
  0  1  1
  1  na na
  

try10 =

   a  b  c
  1  1  1
  

когда я использую слияние, я получаю что-то вроде этого.

pd.merge(a12, try10) =

   a  b  c  b_y  c_y
  0  1  1   na  na
  1  na na  1   1
  

Я решил сделать это вручную, но я думаю, что должен быть более питонический способ, чем приведенный ниже. Я был бы признателен за вашу помощь.

 for i, val in a12.iterrows():
    for x, xval in try10.iterrows():
        if xval['Firm1'] == val['Firm']: 
            try10.ix[x]['AMranking'] =  val['AMranking']
            try10.ix[x]['numlawyers'] = val['numlawyers']
            try10.ix[x]['grossprofits'] = val['grossprofits']  

del try12['firm']
  

Ответ №1:

Существует combine_first метод, который вы можете использовать. Смотрите здесь. Вам нужно будет установить желаемый ключ в обоих фреймах данных в качестве индекса.

 In [128]: a12.set_index ('a').combine_first(try10.set_index('a'))
Out[128]: 
   b  c
a      
0  1  1
1  1  1
  

Ответ №2:

Вы можете просто применить dropna к a12 перед merge :

 In [53]:

a12 = pd.DataFrame({'a':[0, 1], 'b':[1, np.nan], 'c':[1, np.nan]})
try10= pd.DataFrame({'a':[1], 'b':[1], 'c':[1]})
In [54]:

print pd.merge(a12, try10, how='outer', left_on='a', right_on='a')
   a  b_x  c_x  b_y  c_y
0  0    1    1  NaN  NaN
1  1  NaN  NaN    1    1
In [55]:

print pd.merge(a12.dropna(0), try10, how='outer')
   a  b  c
0  0  1  1
1  1  1  1
  

Если a — это индекс:

 In [57]:

print pd.merge(a12.dropna(0).reset_index(), try10.reset_index(), how='outer').set_index('a')
   b  c
a      
0  1  1
1  1  1