python - 将值从 Pandas 中的不同数据帧映射到数据帧

标签 python pandas dataframe replace mapping

问题:我有 2 个数据框 df1df2 。我的目标是修改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 循环,我检查 df1 的通用行是否存在( row1 ) 位于 df2 的内部。如果满足此条件,则我将 row1['B'] 中包含的值替换为 row2['Z'] 中包含的值。

因此我得到的结果是(正是我想要的结果):

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

注意 B 列如何变化。

问题:您能否建议我一种更好的方式来编写代码?我想通过使用 Pandas 或 Python 提供的内置函数使其尽可能快。

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

最佳答案

对两列使用合并:

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')

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

关于python - 将值从 Pandas 中的不同数据帧映射到数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40744013/

相关文章:

python - Pandas 将 groupby sum 值分配给原始表中的最后一行

python 字典到具有多列的 pandas 数据框

R - 按分组行观察折叠数据

python - 在 Apache Spark 中拆分 DataFrame

python - Pandas 时间序列和 groupby

python - Apple 会允许 iOS App Store 中使用 Python 中的 Kivi 框架吗?

python-3.x - 从 Pandas 数据框中仅提取数字和字符串

python - Pandas 多索引 DataFrame 排序

python - 运行时警告 : Divide by Zero error: How to avoid? PYTHON,NUMPY

python - Scapy show2() 包问题