2017-10-09 88 views
1

我有兩個不平衡的數據幀,並希望通過減去值來創建第三個值,以獲得它們之間的增量。以下是三個數據框的示例。我想拿CURRENT,減去相應的EXPECTED來獲得DELTA。這可以按預期工作,並且當CURRENT和EXPECTED中的值存在時,我會在DELTA中生成正確的結果。但是,當它們不存在時,我會在DELTA中獲得NaN。當我希望如下:在熊貓中減去兩個不平衡的數據幀

 CURRENT 
     Region1 Region2 
type1 5   3 
type2 2   11 
type3 7   1 

     EXPECTED 
     Region1 Region2 
type1 15   1 
type2 6   4 

     DELTA 
     Region1 Region2 
type1 -10  2 
type2 -4   7 
type3 7   1 

用我目前的代碼,DELTA中的type3行是NaN,NaN。

def get_delta(self, CURRENT, EXPECTED): 
    delta = CURRENT 
    delta['Region1'] = current[['Region1']] - \ 
           expected[['Region1']] 
    delta['Region2'] = current[['Region2']] - \ 
           expected[['Region2']] 
    return delta 

我試着檢查delta.isnull()或delta.empty,但不起作用。實質上,我想將EXPECTED中的任何不存在的值視爲0,然後僅執行減法CURRENT - RESERVED以獲得DELTA。我想我可以用任何治療爲NaN 0做到這一點,或在丟失的行與行正確/預期指數爲0

填充我想:

new_df = pd.concat([CURRENT, EXPECTED], axis=1).fillna(0) 

,然後從那裏減去,但是當我嘗試concat時,我得到一個錯誤「ValueError:shape mismatch:形狀(0,13)的值數組無法廣播到形狀的索引結果(1,13)」,所以不知道那裏發生了什麼。

回答

0

您需要DataFrame.sub與參數fill_value=0

DELTA = CURRENT.sub(EXPECTED, fill_value=0) 
print (DELTA) 
     Region1 Region2 
type1 -10.0  2.0 
type2  -4.0  7.0 
type3  7.0  1.0 
+0

謝謝!這正是我所需要的,並允許我從代碼中刪除整個delta函數。 – Aaron

+0

不客氣 – jezrael

0

使用reindex

In [217]: CURRENT - EXPECTED.reindex(CURRENT.index, fill_value=0) 
Out[217]: 
     Region1 Region2 
type1  -10  2 
type2  -4  7 
type3  7  1 

詳細

In [218]: CURRENT 
Out[218]: 
     Region1 Region2 
type1  5  3 
type2  2  11 
type3  7  1 

In [219]: EXPECTED 
Out[219]: 
     Region1 Region2 
type1  15  1 
type2  6  4