[英]update a column value in a dataframe from another matching column in different dataframe in Pandas
i have two dataframes 我有两个数据帧
df
city mail
a satya
b def
c akash
d satya
e abc
f xyz
#Another Dataframe d as
city mail
x satya
y def
z akash
u ash
So now i need to update city in df from updated values in 'd' comparing the mails, if some mail id not found it should remain as it was. 所以现在我需要更新df中的城市来自'd'中比较邮件的更新值,如果找不到某些邮件ID,它应该保持不变。 So it should look like
所以看起来应该是这样的
df ### o/p should be like
city mail
x satya
y def
z akash
x satya #repeated so same value should placed here
e abc # not found so as it was
f xyz
I have tried -- 我试过了 -
s = {'mail': ['satya', 'def', 'akash', 'satya', 'abc', 'xyz'],'city': ['a', 'b', 'c', 'd', 'e', 'f']}
s1 = {'mail': ['satya', 'def', 'akash', 'ash'],'city': ['x', 'y', 'z', 'u']}
df = pd.DataFrame(s)
d = pd.DataFrame(s1)
#from google i tried
df.loc[df.mail.isin(d.mail),['city']] = d['city']
#giving erronous result as #giving错误的结果为
city mail
x satya
y def
z akash
u satya ###this value should be for city 'x'
e abc
f xyz
I can't do a merge here on='mail',how='left', as in one dataframe i have less customer.So after merging, how can i map the value of non matching mail's city in merged one. 我不能在='mail',how ='left'进行合并,因为在一个数据帧中我的客户较少。因此,在合并之后,如何在合并后的城市中映射非匹配邮件城市的值。
Please suggest. 请建议。
It looks like you want to update the city
value in df
from the city
value in d
. 看起来你要更新的
city
中值df
从city
价值d
。 The update
function is based on the index, so this first needs to be set. update
功能基于索引,因此首先需要设置。
# Add extra columns to dataframe.
df['mobile_no'] = ['212-555-1111'] * len(df)
df['age'] = [20] * len(df)
# Update city values keyed on `mail`.
new_city = df[['mail', 'city']].set_index('mail')
new_city.update(d.set_index('mail'))
df['city'] = new_city.values
>>> df
city mail mobile_no age
0 x satya 212-555-1111 20
1 y def 212-555-1111 20
2 z akash 212-555-1111 20
3 x satya 212-555-1111 20
4 e abc 212-555-1111 20
5 f xyz 212-555-1111 20
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.