pandas - 通过基于另一列查找从具有不同形状的 DataFrame 中减去列
问题描述
df2
具有比 更多的列和行df1
。对于 中的每一行df2
,我想根据其中一列中df1
的匹配值查找相应的行。从 中的匹配行中df1
,我想在df2
和之间减去一列df1
。我尝试set_index
直接减去数据帧,但这导致了很多NaN
.
df1 = pd.DataFrame([[1, 10], [2, 20], [3, 30]],
columns=['A', 'B'])
df2 = pd.DataFrame([[1, 100, 15], [1, 200, 20],
[2, 100, 30], [2, 200, 35],
[3, 100, 50], [3, 200, 55]],
columns=['A', 'X', 'B'])
# For each row in df2, lookup in df1 based on column A, and produce
# difference of values in columnn B.
expected = pd.DataFrame([[1, 100, 5], [1, 200, 10],
[2, 100, 10], [2, 200, 15],
[3, 100, 20], [3, 200, 25]],
columns=['A', 'X', 'B'])
数据框:
df1
A B
0 1 10
1 2 20
2 3 30
df2
A X B
0 1 100 15
1 1 200 20
2 2 100 30
3 2 200 35
4 3 100 50
5 3 200 55
expected
A X B
0 1 100 5
1 1 200 10
2 2 100 10
3 2 200 15
4 3 100 20
5 3 200 25
解决方案
set_indexdf1
到 'A' 并将其映射回df2.A
. 之后做减法:
df2['B'] -= df2.A.map(df1.set_index('A').B)
Out[216]:
A X B
0 1 100 5
1 1 200 10
2 2 100 10
3 2 200 15
4 3 100 20
5 3 200 25
注意:如果df2.A
有值在 中不存在df1.A
,它将返回NaN
该行。我保留它是因为您的示例数据没有指定如何处理它。如果您想B
在这种情况下保持相同的值,您只需要链接.fillna(0)
到末尾或使用选项map
调用方法subtract
fill_value=0
df2['B'] -= df2.A.map(df1.set_index('A').B).fillna(0)
推荐阅读
- sockets - Julia Sockets TCP Connection 在运行脚本时被拒绝,而不是 REPL
- python - python显示列表索引必须是整数,而不是元组错误
- ios - 在 swift 框架中实施 Firebase Analytics
- python - Python的win32com没有关闭?
- recursion - 在 Lisp 中使用递归进行回文检查
- javascript - 在嵌套循环 vanilla JS 中动态添加和删除元素
- sql - 可以替换 SSIS 或 SQL 中所有出现的小写字符吗?
- java - 如何将 RSA 加密数字转换为文本/字符
- python - 熊猫 groupby 条件并重新塑造数据框
- sql - 有没有办法用雪花展平 json 列表?