2016-10-14 3 views
2

Рассмотрим два dataframes:Панды: Объединить две dataframe колонны

df_a = pd.DataFrame([ 
     ['a', 1], 
     ['b', 2], 
     ['c', NaN], 
    ], columns=['name', 'value']) 

df_b = pd.DataFrame([ 
     ['a', 1], 
     ['b', NaN], 
     ['c', 3], 
     ['d', 4] 
    ], columns=['name', 'value']) 

Так выглядит как

# df_a 
    name value 
0 a 1 
1 b 2 
2 c NaN 

# df_b 
    name value 
0 a 1 
1 b NaN 
2 c 3 
3 d 4 

Я хочу, чтобы объединить эти два dataframes и заполнить значения NaN в value колонке с существующим значения в другом столбце. Другими словами, я хочу от:

# DESIRED RESULT 
    name value 
0 a 1 
1 b 2 
2 c 3 
3 d 4 

Конечно, я могу сделать это с помощью пользовательских .map или .apply, но я хочу решение, которое использует merge или тому подобное, не писать пользовательскую функцию слияния. Как это может быть сделано?

ответ

3

Я думаю, что вы можете использовать combine_first:

print (df_b.combine_first(df_a)) 
    name value 
0 a 1.0 
1 b 2.0 
2 c 3.0 
3 d 4.0 

Или fillna:

print (df_b.fillna(df_a)) 
    name value 
0 a 1.0 
1 b 2.0 
2 c 3.0 
3 d 4.0 

Решение с update не так часто, как combine_first:

df_b.update(df_a) 
print (df_b) 
    name value 
0 a 1.0 
1 b 2.0 
2 c 3.0 
3 d 4.0 
+0

'combine_first' отлично работает! Благодарю. Однако, 'fillna' и' update' не работают для внешнего соединения - оба будут заполнять только те значения, которые существуют в вызывающем фреймворке. Например, df_a.fillna (df_b) забывает строку 'd'. То же самое с 'update'. Они не являются общим решением, если вы не можете сделать определенные предположения о своих данных. – tyleha

Смежные вопросы