2016-05-15 2 views
1

У меня есть 2 блока данных: df1 и df2. df1 имеет столбцы ['UserId', 'company', 'deg'] и имеет 100 наблюдений. df2 имеет столбцы ['UserId', 'deg'] и имеет 10 наблюдений. Индексы в df1 и df2 отлично сочетаются с «userId».Обновление/замена pandas из другого фрейма данных

Я хочу обновить df1 с помощью df2. Столбцы «UserId» в df2 являются поднаборами столбцов «UserId» в df1 .... так что ничего не добавлять. Только на основе «userId» (и/или простого индекса).

df1

,'UserId','Company','deg' 
6,'john21','ibm','bs' 
12,'mary33','cisco','ms' 
16,'smith11','intel','none' 
20,'lucy55','intel','bs' 
33,'tanya32','fb','ms' 
39,'ssri44','google','none' 
45,'har43','CDs','none' 

df2

,'UserId','deg' 
16,'smith11','BS' 
39,'ssri44','MS' 
45,'har43','MS' 

Теперь я хочу, чтобы использовать эту информацию в df2 обновить DF1. Как вы видите, значения индекса и userIds полностью совпадают с значениями в df1.

Любые предложения?

Спасибо!

ответ

1

Вы можете сначала replaceNone к NaN, а затем использовать fillna для обновления None значений в df1 по df2:

df1.replace({"'none'": np.nan}, inplace=True) 
#or omit '', for me works uncomment version 
#df1.replace({"none": np.nan}, inplace=True) 

print df1.fillna(df2) 

    'UserId' 'Company' 'deg' 
6 'john21'  'ibm' 'bs' 
12 'mary33' 'cisco' 'ms' 
16 'smith11' 'intel' 'BS' 
20 'lucy55' 'intel' 'bs' 
33 'tanya32'  'fb' 'ms' 
39 'ssri44' 'google' 'MS' 
45 'har43'  'CDs' 'MS' 

Другое решение с update:

df1.replace({"'none'": np.nan}, inplace=True) 

df1.update(df2) 
print df1 
    'UserId' 'Company' 'deg' 
6 'john21'  'ibm' 'bs' 
12 'mary33' 'cisco' 'ms' 
16 'smith11' 'intel' 'BS' 
20 'lucy55' 'intel' 'bs' 
33 'tanya32'  'fb' 'ms' 
39 'ssri44' 'google' 'MS' 
45 'har43'  'CDs' 'MS' 

Если вы хотите обновить df2 по df1 использование merge:

print pd.merge(df2,df1,left_index=True,right_index=True,how='left', on=["'UserId'","'deg'"]) 
    'UserId' 'deg' 'Company' 
16 'smith11' 'BS' 'intel' 
39 'ssri44' 'MS' 'google' 
45 'har43' 'MS'  'CDs' 
Смежные вопросы