Python 将值从中的不同数据帧映射到数据帧

Python 将值从中的不同数据帧映射到数据帧,python,pandas,dataframe,replace,mapping,Python,Pandas,Dataframe,Replace,Mapping,问题:我有两个数据帧df1和df2。我的目标是通过替换df2中的一些值来修改df1 import pandas as pd # dataframe 1 data = {'A':[90,20,30,25,50,60], 'B':['qq','ee','rr','tt','ii','oo'], 'C':['XX','VV','BB','NN','KK','JJ']} df1 = pd.DataFrame(data) # dataframe 2 convert_ta

问题:我有两个数据帧
df1
df2
。我的目标是通过替换
df2
中的一些值来修改
df1

import pandas as pd

# dataframe 1
data = {'A':[90,20,30,25,50,60],
        'B':['qq','ee','rr','tt','ii','oo'],
        'C':['XX','VV','BB','NN','KK','JJ']}
df1 = pd.DataFrame(data)

# dataframe 2
convert_table = {'X': ['dd','ee','ff','gg','hh','ii','ll','mm','nn','oo','pp','qq','rr','ss','tt','uu'], 
                 'Y': ['DD','VV','FF','GG','HH','KK','LL','MM','NN','JJ','PP','XX','BB','SS','NN','LL'], 
                 'Z': [5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61]}
df2 = pd.DataFrame(convert_table)

# search values of df1 inside of df2 and replace values
for idx1,row1 in df1.iterrows():
    for idx2, row2 in df2.iterrows():
        if row1['B']==row2['X'] and row1['C']==row2['Y']:
            df1.replace(to_replace=row1['B'],value=row2['Z'],inplace=True) 
如您所见,我有2个for循环,我检查
df1
row1
)的泛型行是否在
df2
中找到。如果满足此条件,则我将用
row2['Z']

因此,我得到的结果(正是我希望得到的结果):

请注意B列是如何更改的

问题:你能给我建议一种更好的代码编写方法吗?我希望通过使用Pandas或Python提供的内置函数来尽可能快地完成


注意:数据帧中包含的数据仅用于演示目的

在两列上使用“合并”:

df1.merge(df2, left_on=['B','C'], right_on=['X','Y'], how='left')
这里的
how='left'
很关键。如果你不明白为什么,请阅读

我将修改您的示例,创建一个在df1中有一个条目在df2中不存在的示例,即
('ii','KK')

现在检索最终数据帧:

In [3]:
merged.ix[merged.Z.notnull(),'B'] = merged.ix[merged.Z.notnull(),'Z']
merged = merged[['A','B','C']]
merged

Out[3]:
    A   B   C
0  90  43  XX
1  20   7  VV
2  30  47  BB
3  25  59  NN
4  50  ii  KK
5  60  37  JJ

有可能得到与我在示例中得到的列数相同的输出吗?我只是在你发表评论的同时这样做的:)
In [1]:
# dataframe 2
convert_table = {'X': ['dd','ee','ff','gg','hh','ll','mm','nn','oo','pp','qq','rr','ss','tt','uu'], 
                 'Y': ['DD','VV','FF','GG','HH','LL','MM','NN','JJ','PP','XX','BB','SS','NN','LL'], 
                 'Z': [5,7,11,13,17,19,23,29,37,41,43,47,53,59,61]}
df2 = pd.DataFrame(convert_table)



In [2]: merged = df1.merge(df2, left_on=['B','C'], right_on=['X','Y'], how='left')
        merged
Out[2]: 
    A   B   C    X    Y     Z
0  90  qq  XX   qq   XX  43.0
1  20  ee  VV   ee   VV   7.0
2  30  rr  BB   rr   BB  47.0
3  25  tt  NN   tt   NN  59.0
4  50  ii  KK  NaN  NaN   NaN
5  60  oo  JJ   oo   JJ  37.0
In [3]:
merged.ix[merged.Z.notnull(),'B'] = merged.ix[merged.Z.notnull(),'Z']
merged = merged[['A','B','C']]
merged

Out[3]:
    A   B   C
0  90  43  XX
1  20   7  VV
2  30  47  BB
3  25  59  NN
4  50  ii  KK
5  60  37  JJ