2016-04-13 79 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