2016-07-04 63 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