2016-07-04 72 views
1

假設我有兩個dataframes:減去大熊貓dataframes而留下了一些列的完整

data1 = """ 
idx, stat, val 
1, 1, 5 
2, 1, 10 
3, 2, 15 
4, 3, 20 
""" 
data2 = """ 
idx, stat, val 
2, 1, 8 
4, 5, 16 
""" 

(對不起 - 我不知道如何在大熊貓容易編寫這一點 - 我會在現實生活中的CSV閱讀)。

我想減去這兩個數據框,以便只減去val列(實際上這些是站座標)。如果兩個數據幀中只有一個具有相應的索引值(ascii格式的列idx),那麼結果應該是NaN。也可以,如果不匹配的行立即刪除(我會後來無論如何調用dropna)。

因此,我期望的結果將是:

desired = """ 
idx, stat, val 
1, 1, NaN 
2, 1, 2 
3, 2, NaN 
4, 3, 4 
""" 

原則data1.sub(data2)很好地工作 - 除了我不能明白的方式如何「保護」,從減法統計列。我也試過data1.sub(data2['val'], axis=0),但是這搞砸了在data1.sub(data2)中自動執行的行匹配。一種解決方法是在之後用來自data1的原始值重新替換統計列,但這看起來相當笨拙。

回答

1

您可以使用:

df1.set_index(['idx','stat'], inplace=True) 
df2.set_index('idx', inplace=True) 

print (df1.sub(df2[['val']])) 
      val 
idx stat  
1 1  NaN 
2 1  2.0 
3 2  NaN 
4 3  4.0 

print (df1.sub(df2[['val']]).reset_index()) 
    idx stat val 
0 1  1 NaN 
1 2  1 2.0 
2 3  2 NaN 
3 4  3 4.0 

如果idx在兩種df指標:

print (df1) 
    stat val 
idx   
1  1 5 
2  1 10 
3  2 15 
4  3 20 

print (df2) 
    stat val 
idx   
2  1 8 
4  5 16 

df1.set_index('stat', append=True, inplace=True) 
print (df1.sub(df2[['val']]).reset_index()) 
    idx stat val 
0 1  1 NaN 
1 2  1 2.0 
2 3  2 NaN 
3 4  3 4.0