减去大熊猫dataframes而留下了一些列的完整
问题描述:
假设我有两个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
的原始值重新替换统计列,但这看起来相当笨拙。
答
您可以使用:
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