2016-04-13 78 views
4

不同的数据帧另一个匹配列中的数据帧更新一列的值我有两个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 

所以现在我需要从“d”比较邮件更新的值更新城市DF,如果找不到某个邮件ID,它应该保持原样。因此,它应该像

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 

我曾尝试 -

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结果作为

city mail 
x satya 
y def 
z akash 
u satya ###this value should be for city 'x' 
e abc 
f xyz 

我不能在这里做一个合并上= '邮件', how ='left',因为在一个数据框中,我的客户较少。因此合并后,如何映射合并后的非匹配邮件城市的值。

请建议。

+0

预期产量是多少? – Alexander

+0

@ Alexander-some typoerror was there,plz see my edited question。 – Satya

回答

7

看起来好像您想要更新citycity的值city的值dupdate函数基于索引,所以首先需要设置。

# 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 
+0

@亚历山大 - 它如何提供灵活性,只更新那些我想更新的列。它似乎更新从d中的所有匹配列df。 – Satya

+0

如果我在df中有2个额外的列'''','mobile_no',,,同样的两列也在d和updated.But我不希望这两列从d到df更新。只有城市应该更新在df ....不age和mobile_no。 – Satya