减去pandas数据帧,同时保留一些列

时间:2016-07-04 19:40:31

标签: python pandas dataframe

假设我有两个数据帧:

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列,但这似乎相当笨拙。

1 个答案:

答案 0 :(得分: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