2016-05-10 6 views
1

Есть ли элегантный способ объединить значения двух столбцов с одинаковыми именами в двух разных фреймах данных, обновив значения в первом фрейме данных со значениями столбца во втором ядре данных, если значения (т.е. не нуль) во втором блоке данных?pandas: обновление значений столбцов при слиянии DataFrames

Так, если два dataframes являются:

df1 = pd.DataFrame([ 1, 2, None, 3], columns=["a"], index=[0,1,2,3]) 
df2 = pd.DataFrame([ None, None, 4, 5], columns=["a"], index=[0,1,2,3]) 

то желаемый результат будет:

df3 = pd.DataFrame([ 1, 2, 4, 5], columns=["a"], index=[0,1,2,3]) 

В то время как я могу представить себе, как делает это путем выполнения первого слияния(), а затем используя 'apply()' с пользовательской функцией, чтобы объединить значения полученных столбцов вместе, это кажется слишком сложным. Более того, мне нужно сделать это для нескольких столбцов. Есть ли более элегантный способ сделать это?

Функция, которую я ищу, будет вести себя так, как если бы выполнялось левое слияние с 'overwrite_values ​​= True', за исключением того факта, что последний параметр не существует, конечно.

Несколько более сложный пример с двумя колонками:

df1 = pd.DataFrame([ [1, 'a'], [2, 'b'], [None, None], [3, None] ], 
        columns=["a", "b"], index=[0,1,2,3]) 
df2 = pd.DataFrame([ [None, None],[None, 'x'],[4, 'c'], [5, 'd'] ], 
        columns=["a", "b"], index=[0,1,2,3]) 

то желаемый результат будет:

df3 = pd.DataFrame([ [1, 'a'], [2, 'x'], [4, 'c'], [5, 'd']], 
        columns=["a", "b"], index=[0,1,2,3]) 

Большое спасибо!

ответ

2

Вы хотите combine_first:

In [19]: 
df1 = pd.DataFrame([ [1, 'a'], [2, 'b'], [None, None], [3, None] ], 
        columns=["a", "b"], index=[0,1,2,3]) 
df2 = pd.DataFrame([ [None, None],[None, 'x'],[4, 'c'], [5, 'd'] ], 
        columns=["a", "b"], index=[0,1,2,3]) 
df1.combine_first(df2) 

Out[19]: 
    a b 
0 1.0 a 
1 2.0 b 
2 4.0 c 
3 3.0 d 
+0

Действительно, спасибо за быстрый ответ! В этом случае для получения желаемого результата нужно будет df2.combine_first (df1) (так что второй фрейм, вызывающий функцию). – tibi3000

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