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

时间:2018-12-13 08:12:39

标签: 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],
                    '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中出现值(例如“ a”),就从相应的df2 id和columnname = df1.col1值(“ a”)中减去df1.col2值。

以上陈述可能令人困惑,但我将尝试举一个例子进行说明:

df1 id 1001的col1 = a和col2 = 1

我想做的是我想从df2的a列中减去1以获取ID 1001 = 10-1 = 9

在另一个示例中

df1 id = 1004具有col1值= d和col2 = 6 所以从df2的d列中减去6对应于id 1004 = 5-6 = -1 最终结果将是这样

    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

我该如何有效地在Pandas中解决此问题,因为我必须在大型数据集上重复此练习很多次。

预先感谢

1 个答案:

答案 0 :(得分:1)

如下使用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]