2012-06-19 259 views
29

我有兩個dataframes,兩個索引timeseries。我需要將這些元素添加到一起以形成新的dataframe,但前提是索引和列是相同的。如果該項目不存在於dataframe之一中,則應將其視爲零。添加兩個熊貓數據幀

我試過使用.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

謝謝,但我沒有很好地解釋我的數據,因爲我在兩個DataFrame中都有不同的列,例如數據幀1中的A,B,C和數據幀2中的A,B,D。輸出應該是包含A,B,C,D的數據幀。 – cs0679

+0

此答案適用於我的用例。謝謝! – ivrin

0

爲了使更廣泛的答案......首先,我將採取共同的指數都dataframes,那麼我會加入他們每個人同步到我的模式(日期),我將總結的列相同的名稱和最後加入這兩個dataframes(刪除添加的列在其中的一個),

你可以看到一個例子(從谷歌採取了谷歌的股票價格)位置:

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)