假设我有两个数据框:
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)
可以很好地工作-只是我看不到一种如何“保护” stat列免于减法的方法。我也尝试过data1.sub(data2['val'], axis=0)
,但是这弄乱了在data1.sub(data2)
中自动执行的行匹配。一种解决方法是在之后用data1
中的原始值替换stat列,但这似乎很笨拙。 最佳答案
您可以使用:
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