python - 根据两个索引减去两个多索引数据帧
问题描述
我有两个数据框,如下所示:
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)
import pandas as pd
d2 = {'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 很陌生,多索引是我现在生活的祸根。
解决方案
您可以直接减去两个数据帧。它将减去索引匹配的值。
如下所示,
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
推荐阅读
- java - Spring-MVC web.xml 文件不使用 ContextLoaderListener
- python - 导入模块会造成问题吗?
- c++ - 函数没有返回预期的输出
- ruby-on-rails - 如何将此 PostgreSQL 查询转换为 activerecord
- python - 程序未运行时也要继续倒计时
- mysql - 我可以使用 MySql 在 ms-access 中创建像 .mdb 这样的单个数据库文件吗?
- c++-cli - LNK2020:未解析的令牌(06000001)和 LNK4248:未解析的 typeref 令牌(0100001E)
- performance - AVX 256 位向量比标量 (~10%) 略慢于 Xeon Gold 上的大型阵列上类似 STREAM 的双加循环
- c - 双向链表上的快速排序无法正常工作
- r - 跨 xts 列应用滚动函数以返回值