Python 如何基于另一个数据帧的特定列的值更新一个数据帧的多列中的值

Python 如何基于另一个数据帧的特定列的值更新一个数据帧的多列中的值,python,pandas,dataframe,Python,Pandas,Dataframe,我有2个padas数据帧 df1 = pd.DataFrame({'id': [1001,1002,1004], 'col1': ["a","b","d"], 'col2': [1,2,6]}) df2 = pd.DataFrame({'id': [1001,1002,1003,1004,1005,1006,1007], 'a': [10,10,10,10,10,10,10],

我有2个padas数据帧

df1 = pd.DataFrame({'id': [1001,1002,1004],
                   'col1': ["a","b","d"],
                   'col2': [1,2,6]})

df2 = pd.DataFrame({'id': [1001,1002,1003,1004,1005,1006,1007],
                    'a': [10,10,10,10,10,10,10],
                    'b': [2,2,2,2,2,2,2],
                    'c': [1,2,3,4,5,6,7],
                    'd': [5,5,5,5,5,4,5],
                    'e': [0,3,4,6,7,5,5]})
df1和df2具有公共id

当值出现在df1.col1中时,例如从相应的df2 id中减去df1.col2值,columnname=df1.col1值a

上述陈述可能令人困惑,但我将尝试用一个例子来解释:

df1 id 1001具有col1=a和col2=1

我想做的是从df2的a列中减去1,id 1001=10-1=9

在另一个例子中

df1 id=1004具有col1值=d和col2=6 因此,从对应于ID1004=5-6=-1的df2的d列中减去6 最终结果如下所示

    a  b  c  d  e     id
0   9  2  1  5  0   1001
1  10  0  2  5  3   1002
2  10  2  3  5  4   1003
3  10  2  4 -1  6   1004
4  10  2  5  5  7   1005
5  10  2  6  4  5   1006
6  10  2  7  5  5   1007
既然我必须在大数据集上重复这个练习很多次,那么我应该如何有效地解决这个问题呢

提前感谢

使用lambda如下

    df1.apply(lambda row : updateDF2(row), axis=1)
完整的示例代码是

import pandas as pd
df1 = pd.DataFrame({'id': [1001,1002,1004],
                   'col1': ["a","b","d"],
                   'col2': [1,2,6]})

df2 = pd.DataFrame({'id': [1001,1002,1003,1004,1005,1006,1007],
                    'a': [10,10,10,10,10,10,10],
                    'b': [2,2,2,2,2,2,2],
                    'c': [1,2,3,4,5,6,7],
                    'd': [5,5,5,5,5,4,5],
                    'e': [0,3,4,6,7,5,5]})
def updateDF2(row):
    df2.loc[df2["id"] == row["id"], row["col1"]] -= row["col2"]

#df1.apply(lambda row : updateDF2(row), axis=1)
df1.apply(updateDF2, axis=1)

print(df2)
输出为

    a  b  c  d  e    id
0   9  2  1  5  0  1001
1  10  0  2  5  3  1002
2  10  2  3  5  4  1003
3  10  2  4 -1  6  1004
4  10  2  5  5  7  1005
5  10  2  6  4  5  1006
6  10  2  7  5  5  1007
[Finished in 0.9s]

您只需要向函数传递一个axis参数,它将按行而不是按列工作。我认为df1.applyupdateDF2,axis=1应该足够了