2012-06-19 4 views
29

У меня есть два dataframes, оба индексируются timeseries. Мне нужно добавить элементы вместе, чтобы сформировать новый dataframe, но только если индекс и столбец совпадают. Если элемент не существует в одном из dataframe s, его следует рассматривать как ноль.Добавление двух кадров данных pandas

Я пробовал использовать .add, но эти суммы не зависят от индекса и столбца. Также попробовал простой combined_data = dataframe1 + dataframe2, но это дает NaN, если оба элемента данных не имеют элемента.

Любые предложения?

+0

Можете ли вы уточнить, что вы хотите, чтобы произошло, если элемент не существует в одном или обоих dataframes? Вы говорите, что если элемент не существует в * one * dataframe, его следует рассматривать как нуль - вы имеете в виду, что значение в этом фрейме данных должно рассматриваться как ноль и добавлено к значению из другого блока данных, или вы имеете в виду значение в кадре данных результата должно быть равным нулю? Кроме того, вы говорите, что 'df1 + df2' не работает, потому что он дает NaN, если у обоих нет элемента. Что вы хотите в этом случае? Вы хотите получить нуль? – BrenBarn

ответ

48

Как насчет x.add(y, fill_value=0)?

import pandas as pd 

df1 = pd.DataFrame([(1,2),(3,4),(5,6)], columns=['a','b']) 
Out: 
    a b 
0 1 2 
1 3 4 
2 5 6 

df2 = pd.DataFrame([(100,200),(300,400),(500,600)], columns=['a','b']) 
Out: 
    a b 
0 100 200 
1 300 400 
2 500 600 

df_add = df1.add(df2, fill_value=0) 
Out: 
    a b 
0 101 202 
1 303 404 
2 505 606 
+0

Отлично, только то, что я был после. благодаря – cs0679

7

Если я вас правильно понял, вы хотите что-то вроде:

(x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 

Это даст сумму двух dataframes. Если значение находится в одном кадре данных, а не другом, результатом в этой позиции будет существующее значение. Если в обоих кадрах данных отсутствует значение, результат в этой позиции будет равен нулю.

>>> x 
    A B C 
0 1 2 NaN 
1 3 NaN 4 
>>> y 
    A B C 
0 8 NaN 88 
1 2 NaN 5 
2 10 11 12 
>>> (x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 
    A B C 
0 9 2 88 
1 5 0 9 
2 10 11 12 
+1

Спасибо, но я не очень хорошо объяснил свои данные, поскольку у меня есть разные столбцы в обоих DataFrames, например. A, B, C в dataframe1 и A, B, D в фрейме 2. Выходной сигнал должен быть кадром данных с A, B, C, D – cs0679

+0

. Этот ответ работает для меня. Благодаря! – ivrin

0

Для создания более общего ответа ... первый я возьму общий индекс для синхронизации обоих dataframes, то я присоединюсь к каждому из них моего шаблона (даты) и я подведу столбцы то же имя, и, наконец, присоединиться как dataframes (удаление добавленных столбцов в одной из них),

вы можете увидеть пример (с ценами на акции Google, взяты из Google) можно здесь:

import numpy as np 
import pandas as pd 
import datetime as dt 

prices = pd.DataFrame([[553.0, 555.5, 549.3, 554.11, 0], 
         [556.8, 556.8, 544.05, 545.92, 545.92], 
         [545.5, 546.89, 540.97, 542.04, 542.04]], 
         index=[dt.datetime(2014,11,04), dt.datetime(2014,11,05), dt.datetime(2014,11,06)], 
         columns=['Open', 'High', 'Low', 'Close', 'Adj Close']) 

corrections = pd.DataFrame([[0, 555.22], [1238900, 0]], 
        index=[dt.datetime(2014,11,3), dt.datetime(2014,11,4)], 
        columns=['Volume', 'Adj Close']) 

dates = pd.DataFrame(prices.index, columns = ['Dates']).append(pd.DataFrame(corrections.index, columns = ['Dates'])).drop_duplicates('Dates').set_index('Dates').sort(axis=0) 
df_corrections = dates.join(corrections).fillna(0) 
df_prices = dates.join(prices).fillna(0) 

for col in prices.columns: 
    if col in corrections.columns: 
     df_prices[col]+=df_corrections[col] 
     del df_corrections[col] 

df_prices = df_prices.join(df_corrections) 
1

обе вышеуказанные ответы - fillna(0) и прямое добавление даст вам значения Nan, если они имеют разные структуры.

Его лучше использовать fill_value

df.add(other_df, fill_value=0)

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