2017-02-08 2 views
1

Как наложить/консолидировать два фрейма данных в python, чтобы добавить перекрывающиеся ячейки (индекс, столбец), а необычные ячейки сохранить значения из исходного кадра данных?Консолидация двух фреймов данных в Python

Это возможно в Excel, как описано here.

Для Eg: У меня есть два кадра данных

df1 = df1 df2 = df2

Я хочу, чтобы выходной быть как

output_df = output_df

ответ

1

Вам нужно add с fillna , но в df1 и df2 должно быть NO NaN значений, be вызвать fillna удалили их:

print (df1.add(df2, fill_value=0).fillna(0).astype(int)) 
    a b c 
a1 1 2 0 
a2 3 514 123 
a3 5 539 134 

Другое решение с union обоих indexes и reindex - работает, если NaN в DataFrames:

idx = df1.index.union(df2.index) 

print (df1.reindex(idx, fill_value=0)) 
    a b 
a1 1 2 
a2 3 4 
a3 5 6 

print (df2.reindex(idx, fill_value=0)) 
     b c 
a1 0 0 
a2 510 123 
a3 533 134 

idx = df1.index.union(df2.index) 
print (df1.reindex(idx, fill_value=0) 
     .add(df2.reindex(idx, fill_value=0), fill_value=0) 
     .astype(int)) 
    a b c 
a1 1 2 0 
a2 3 514 123 
a3 5 539 134 

df1 = pd.DataFrame({'a':[1,3,5], 
        'b':[2,4,6]}, index=['a1','a2','a3']) 

print (df1) 
    a b 
a1 1 2 
a2 3 4 
a3 5 6 

df2 = pd.DataFrame({'b':[510,533], 
        'c':[123,np.nan]}, index=['a2','a3']) 

print (df2) 
     b  c 
a2 510 123.0 
a3 533 NaN 

print (df1.reindex(idx, fill_value=0).add(df2.reindex(idx, fill_value=0), fill_value=0)) 
     a b  c 
a1 1.0 2 0.0 
a2 3.0 514 123.0 
a3 5.0 539 NaN 
print (df1.add(df2, fill_value=0).fillna(0).astype(int)) 
    a b c 
a1 1 2 0 
a2 3 514 123 
a3 5 539 0 <- replace NaN to 0 
+0

Чем k вам так много !! Я пошел с вашим первым решением, поскольку второе решение может свернуть индексы. Исправьте меня, если я ошибаюсь – user3471409

+0

Я думаю, что второе решение работает тоже, но это немного сложно, потому что работает, если в dataframes (один из них или обоих) есть 'NaN'. – jezrael

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