将值从Pandas中不同的dataframe映射到dataframe

2024-06-01 01:17:54 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:我有两个数据帧df1和{}。我的目标是修改df1,如果在df2中找到了它的一些值,那么就替换它的一些值。在

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循环,我检查df1row1)的泛型行是否在df2内找到。如果满足这个条件,那么我用row2['Z']中包含的值替换行1['B']中包含的值

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

^{pr2}$

注意B列的变化。在

问题:您能给我一个更好的编写代码的方法吗?我希望尽可能快地使用Pandas或Python提供的内置函数。在

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


Tags: 数据dataframefordatarrnnreplaceee
1条回答
网友
1楼 · 发布于 2024-06-01 01:17:54

对两列使用合并:

df1.merge(df2, left_on=['B','C'], right_on=['X','Y'], how='left')

how='left'在这里很关键。如果你不明白为什么要读Brief primer on merge methods (relational algebra)。在

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

^{pr2}$

现在要检索最终的数据帧:

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

相关问题 更多 >