首页 > 解决方案 > 通过基于另一列查找从具有不同形状的 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

标签: pandas

解决方案


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调用方法subtractfill_value=0

df2['B'] -= df2.A.map(df1.set_index('A').B).fillna(0)

推荐阅读