Python 基于两个索引减去两个多索引数据帧
我有两个数据帧,如下所示:Python 基于两个索引减去两个多索引数据帧,python,pandas,multidimensional-array,Python,Pandas,Multidimensional Array,我有两个数据帧,如下所示: df1 = val id1 id2 foo 1 50 2 100 4 200 bar 1 25 4 100 8 200 baz 2 75 4 150 df2 = val id1 id2 foo 1 60 2 200 3 100 bar 1 50 4
df1 =
val
id1 id2
foo 1 50
2 100
4 200
bar 1 25
4 100
8 200
baz 2 75
4 150
df2 =
val
id1 id2
foo 1 60
2 200
3 100
bar 1 50
4 101
8 202
baz 2 70
5 155
我正在尝试创建一个新的数据框,它比较两个索引,并且仅当两个索引匹配时才减去val
列
如何生成数据:
import pandas as pd
d1 = {'id1':['foo','foo', 'foo', 'bar', 'bar', 'bar','baz', 'baz'],
'id2':[1, 2, 4, 1, 4, 8, 2, 4],
'val':[50, 100, 200, 25, 100, 200, 75, 150]}
df1 = pd.DataFrame(data=d1)
df1.set_index(['id1', 'id2'], inplace=True)
我对python非常陌生,现在多索引是我生活中的祸根。您可以直接减去两个数据帧。它将减去索引匹配的值 如下图所示
res=df1-df2
res[res['val'].notnull()]
输出:
val
id1 id2
bar 1 -25.0
4 -1.0
8 -2.0
baz 2 5.0
4 NaN
5 NaN
foo 1 -10.0
2 -100.0
3 NaN
4 NaN
val
id1 id2
bar 1 -25.0
4 -1.0
8 -2.0
baz 2 5.0
foo 1 -10.0
2 -100.0
val res
id1 id2
foo 1 50 -10.0
2 100 -100.0
4 200 NaN
bar 1 25 -25.0
4 100 -1.0
8 200 -2.0
baz 2 75 5.0
4 150 NaN
如果您只想查看匹配的记录,请尝试以下操作
res=df1-df2
res[res['val'].notnull()]
输出:
val
id1 id2
bar 1 -25.0
4 -1.0
8 -2.0
baz 2 5.0
4 NaN
5 NaN
foo 1 -10.0
2 -100.0
3 NaN
4 NaN
val
id1 id2
bar 1 -25.0
4 -1.0
8 -2.0
baz 2 5.0
foo 1 -10.0
2 -100.0
val res
id1 id2
foo 1 50 -10.0
2 100 -100.0
4 200 NaN
bar 1 25 -25.0
4 100 -1.0
8 200 -2.0
baz 2 75 5.0
4 150 NaN
有关更多详细信息,请访问此链接
如果您有多个列,并且希望对单个列执行减法,请在下面使用
df1['res']=df1['val']-df2['val']
输出:
val
id1 id2
bar 1 -25.0
4 -1.0
8 -2.0
baz 2 5.0
4 NaN
5 NaN
foo 1 -10.0
2 -100.0
3 NaN
4 NaN
val
id1 id2
bar 1 -25.0
4 -1.0
8 -2.0
baz 2 5.0
foo 1 -10.0
2 -100.0
val res
id1 id2
foo 1 50 -10.0
2 100 -100.0
4 200 NaN
bar 1 25 -25.0
4 100 -1.0
8 200 -2.0
baz 2 75 5.0
4 150 NaN
上面的代码段对
val
列执行减法运算,并将其存储到名为res
的新列中。您可以像这样简单地进行减法,打印df1-df2
。注意:df2分配df1的数据。我建议您使用:df=df.reset_index(),直到您对多重索引有了更多的经验。谢谢您的回答。它适用于上述情况,但不适用于存在多个列(包含字符串)的情况。有没有办法做到这一点而不删除不需要的列?