Python 3.x 如何根据其他三列中的特定值将值从df1中的一列复制到df2?

Python 3.x 如何根据其他三列中的特定值将值从df1中的一列复制到df2?,python-3.x,pandas,dataframe,Python 3.x,Pandas,Dataframe,我有两个具有相似形状和列名的数据帧,希望复制df1['property']的值并将它们粘贴到df2['property'],但有一个条件 df1: df2: 其他三列(i、j、k)表示不同的位置,只有当df1['i'、'j'、'k']]与df2[[i'、'j'、'k']相同时,df1['property']的复制值才能替换df2['property']。有人能帮我吗 在我看来,我应该使用map函数,但我不知道如何在三列条件下这样做 IIUC您想要: 我们还可以使用: 输出 i j

我有两个具有相似形状和列名的数据帧,希望复制df1['property']的值并将它们粘贴到df2['property'],但有一个条件

df1:

df2:

其他三列(i、j、k)表示不同的位置,只有当df1['i'、'j'、'k']]与df2[[i'、'j'、'k']相同时,df1['property']的复制值才能替换df2['property']。有人能帮我吗

在我看来,我应该使用map函数,但我不知道如何在三列条件下这样做

IIUC您想要:


我们还可以使用:

输出

    i  j  k  property
0   1  1  1        10
1   2  1  1       100
2   3  1  1       190
3   1  2  1        40
4   2  2  1       130
5   3  2  1       220
6   1  3  1        70
7   2  3  1       160
8   3  3  1       250
9   1  1  2        20
10  2  1  2       110
11  3  1  2       200
12  1  2  2        50
13  2  2  2       140
14  3  2  2       230
15  1  3  2        80
16  2  3  2       170
17  3  3  2       260
18  1  1  3        30
19  2  1  3       120
20  3  1  3       210
21  1  2  3        60
22  2  2  3       150
23  3  2  3       240
24  1  3  3        90
25  2  3  3       180
26  3  3  3       270
我会这样做:

import pandas as pd, numpy as np

df1 = pd.DataFrame(dict(i=np.repeat([1,2,3],9), j=np.repeat([[1,2,3],[1,2,3],[1,2,3]],3), k=[1,2,3]*9,\
        property=range(10,280,10)))

df2 = pd.DataFrame(dict(k=np.repeat([1,2,3],9), j=np.repeat([[1,2,3],[1,2,3],[1,2,3]],3), i=[1,2,3]*9,\
        property=100))


df = pd.concat([df1,df2.rename(columns={"i":"ii","j":"jj","k":"kk","property":"property2"})],axis=1)

df.property2 = np.where((df.i==df.ii)&(df.j==df.jj)&(df.k==df.kk),df.property,df.property2)
df=df[["ii","jj","kk","property2"]]
print(df)
给出:

    ii  jj  kk  property2
0    1   1   1         10
1    2   1   1        100
2    3   1   1        100
3    1   2   1         40
4    2   2   1        100
5    3   2   1        100
6    1   3   1         70
7    2   3   1        100
8    3   3   1        100
9    1   1   2        100
10   2   1   2        110
11   3   1   2        100
12   1   2   2        100
13   2   2   2        140
14   3   2   2        100
15   1   3   2        100
16   2   3   2        170
17   3   3   2        100
18   1   1   3        100
19   2   1   3        100
20   3   1   3        210
21   1   2   3        100
22   2   2   3        100
23   3   2   3        240
24   1   3   3        100
25   2   3   3        100
26   3   3   3        270

对不起,这不是我想要的输出。数据帧具有相同的列名称,但i、j、k中值的位置不同。尽管@ansev已经帮了我一个好答案。谢谢你的帮助
df2_update=df2.set_index(['i','j','k'])
df2_update.update(df1.set_index(['i','j','k']))
df2_update = df2_update.reset_index()
print(df2_update)
    i  j  k  property
0   1  1  1        10
1   2  1  1       100
2   3  1  1       190
3   1  2  1        40
4   2  2  1       130
5   3  2  1       220
6   1  3  1        70
7   2  3  1       160
8   3  3  1       250
9   1  1  2        20
10  2  1  2       110
11  3  1  2       200
12  1  2  2        50
13  2  2  2       140
14  3  2  2       230
15  1  3  2        80
16  2  3  2       170
17  3  3  2       260
18  1  1  3        30
19  2  1  3       120
20  3  1  3       210
21  1  2  3        60
22  2  2  3       150
23  3  2  3       240
24  1  3  3        90
25  2  3  3       180
26  3  3  3       270
import pandas as pd, numpy as np

df1 = pd.DataFrame(dict(i=np.repeat([1,2,3],9), j=np.repeat([[1,2,3],[1,2,3],[1,2,3]],3), k=[1,2,3]*9,\
        property=range(10,280,10)))

df2 = pd.DataFrame(dict(k=np.repeat([1,2,3],9), j=np.repeat([[1,2,3],[1,2,3],[1,2,3]],3), i=[1,2,3]*9,\
        property=100))


df = pd.concat([df1,df2.rename(columns={"i":"ii","j":"jj","k":"kk","property":"property2"})],axis=1)

df.property2 = np.where((df.i==df.ii)&(df.j==df.jj)&(df.k==df.kk),df.property,df.property2)
df=df[["ii","jj","kk","property2"]]
print(df)
    ii  jj  kk  property2
0    1   1   1         10
1    2   1   1        100
2    3   1   1        100
3    1   2   1         40
4    2   2   1        100
5    3   2   1        100
6    1   3   1         70
7    2   3   1        100
8    3   3   1        100
9    1   1   2        100
10   2   1   2        110
11   3   1   2        100
12   1   2   2        100
13   2   2   2        140
14   3   2   2        100
15   1   3   2        100
16   2   3   2        170
17   3   3   2        100
18   1   1   3        100
19   2   1   3        100
20   3   1   3        210
21   1   2   3        100
22   2   2   3        100
23   3   2   3        240
24   1   3   3        100
25   2   3   3        100
26   3   3   3        270