我想基于(df2.Name1, df2.Name2)中的映射表覆盖我的df1.Name值。但是,并非所有df1.Name中的值都存在于df2.Name1中
df1:
Name
Alex
Maria
Marias
Pandas
Coaladf2:
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语句创建一个函数,但是失败了。
我该如何解决这个问题?
发布于 2018-01-16 04:46:51
通过使用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发布于 2018-01-16 04:43:39
让我们使用带有map和combine_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发布于 2018-01-16 04:19:03
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']https://stackoverflow.com/questions/48269844
复制相似问题