仅当值存在时,才通过vlookup替换另一个数据帧中的值

时间:2018-01-15 19:58:11

标签: python pandas dictionary dataframe matching

我想根据df1.Name中的映射表覆盖(df2.Name1, df2.Name2)个值。但是,并非df1.Name

中存在df2.Name1中的所有值

DF1:

Name
Alex
Maria 
Marias
Pandas
Coala

DF2:

Name1   Name2
Alex    Alexs
Marias  Maria
Coala   Coalas

预期结果:

Name
Alexs
Maria
Maria
Pandas
Coalas

我在线尝试了几种解决方案,例如使用Map功能。通过在我使用df2的词典中翻转df1.Name = df1.Name.map(Dictionary),但这将导致nan所有值不在df2中,如下所示。

Name
Alexs
Maria
Maria
NAN
Coalas

我不确定如何使用IF语句只替换df2中存在的那些语句,并按照df1保留其余语句。 我还试图用if语句创建一个函数,但是时间很长。

我如何解决这个问题?

5 个答案:

答案 0 :(得分:4)

使用replace

df1.Name.replace(df2.set_index('Name1').Name2.to_dict())
Out[437]: 
0     Alexs
1     Maria
2     Maria
3    Pandas
4    Coalas
Name: Name, dtype: object

答案 1 :(得分:3)

您也可以使用replace

CREATE PROCEDURE `Increment_rows`(IN TheTable VARCHAR(20),IN TheID VARCHAR(20))
BEGIN
DECLARE i INT;
SET i = 0;
UPDATE TheTable 
SET TheID = i,i= i+1;
END

replace可以使用字典,您可以在其中指定要替换的列,此处为df1 = pd.DataFrame({'Name': ['Alex', 'Maria', 'Marias', 'Pandas', 'Coala']}) df2 = pd.DataFrame({'Name1': ['Alex', 'Marias', 'Coala'], 'Name2': ['Alexs', 'Maria', 'Coalas']}) # Create the dictionary from df2 d = {"Name": {k:v for k, v in zip(df2["Name1"], df2["Name2"])}} # Suggestion from Wen to create the dictionary # d = {"Name": df2.set_index('Name1').Name2.to_dict()} df1.replace(d) # Use df1.replace(d, inplace=True) if you want this in place Name 0 Alexs 1 Maria 2 Maria 3 Pandas 4 Coalas ,以及要在此特定列中替换的相应映射。

"Name"

- >替换{"Name": {old_1: new_1, old_2: new_2...}} 列中的值,以便将"Name"替换为old_1new_1将替换为old_2,依此类推。

感谢Stephen Rauch的设置。感谢Wen提供了一种创建字典的简洁方法。

答案 2 :(得分:3)

让我们使用带有mapcombine_first的Pandas解决方案:

df1['Name'].map(df2.set_index('Name1')['Name2']).combine_first(df1['Name'])

输出:

0     Alexs
1     Maria
2     Maria
3    Pandas
4    Coalas
Name: Name, dtype: object

答案 3 :(得分:3)

您也可以使用merge

In [27]: df1['Name'] = df1.merge(df2.rename(columns={'Name1':'Name'}), how='left') \
                          .ffill(axis=1)['Name2']

In [28]: df1
Out[28]:
     Name
0   Alexs
1   Maria
2   Maria
3  Pandas
4  Coalas

答案 4 :(得分:2)

Python dict.get()允许使用默认参数。因此,如果您构建转换字典,那么如果找不到查找,则很容易返回原始值,如:

代码:

translate = {x: y for x, y in df2[['Name1', 'Name2']].values}
new_names = [translate.get(x, x) for x in df1['Name']]

测试代码:

import pandas as pd

df1 = pd.DataFrame({'Name': ['Alex', 'Maria', 'Marias', 'Pandas', 'Coala']})
df2 = pd.DataFrame({'Name1': ['Alex', 'Marias', 'Coala'],
                    'Name2': ['Alexs', 'Maria', 'Coalas']})

print(df1)
print(df2)

translate = {x: y for x, y in df2[['Name1', 'Name2']].values}
print([translate.get(x, x) for x in df1['Name']])

测试结果:

     Name
0    Alex
1   Maria
2  Marias
3  Pandas
4   Coala

    Name1   Name2
0    Alex   Alexs
1  Marias   Maria
2   Coala  Coalas

['Alexs', 'Maria', 'Maria', 'Pandas', 'Coalas']