我想根据df1.Name
中的映射表覆盖(df2.Name1, df2.Name2)
个值。但是,并非df1.Name
df2.Name1
中的所有值
Name
Alex
Maria
Marias
Pandas
Coala
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
语句创建一个函数,但是时间很长。
我如何解决这个问题?
答案 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_1
。 new_1
将替换为old_2
,依此类推。
感谢Stephen Rauch的设置。感谢Wen提供了一种创建字典的简洁方法。
答案 2 :(得分:3)
让我们使用带有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
答案 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']