为了账号安全,请及时绑定邮箱和手机立即绑定

基于两个索引减去两个多索引数据帧

基于两个索引减去两个多索引数据帧

呼如林 2021-06-11 17:37:04
我有两个数据框,如下所示:df1 =           valid1 id2foo  1     50     2    100     4    200bar  1     25     4    100     8    200baz  2     75     4    150df2 =           valid1 id2foo  1     60     2    200     3    100bar  1     50     4    101     8    202baz  2     70     5    155我正在尝试创建一个新的数据框,它比较两个索引并val仅在两个索引匹配时减去该列。如何生成数据:import pandas as pdd1 = {'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) import pandas as pdd2 = {'id1':['foo','foo', 'foo', 'bar', 'bar', 'bar','baz', 'baz'],   'id2':[1, 2, 3, 1, 4, 8, 2, 5],    'val':[60, 200, 100, 50, 101, 202, 70, 155]}df2 = pd.DataFrame(data=d2)df2.set_index(['id1', 'id2'], inplace=True)我对 python 很陌生,多索引现在是我生活的祸根。
查看完整描述

1 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您可以直接减去两个数据帧。它将减去索引匹配的值。


像下面,


res=df1-df2

输出:


           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

如果您只想查看匹配的记录,请尝试如下操作,


res[res['val'].notnull()]

输出:


id1 id2       

bar 1    -25.0

    4     -1.0

    8     -2.0

baz 2      5.0

foo 1    -10.0

    2   -100.0

有关更多详细信息,请访问此链接多索引


如果您有多个列并希望对下面的单列执行减法


df1['res']=df1['val']-df2['val']

输出:


         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


查看完整回答
反对 回复 2021-06-15
  • 1 回答
  • 0 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号