我有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中解决此问题,因为我必须在大型数据集上重复此练习很多次。
预先感谢
答案 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]