#python #string #pandas #matching
#python #строка #pandas #соответствие
Вопрос:
У меня есть два фрейма данных df_l (с 3000 строками) и df_s (со 100 строками): df_l
version|update_date
2.3.4| date1
3.4.5|date2
и df_s
version|release_date
2.3.4| date1
3.4.5|date2
3.3.3|date3
Я хочу проверить, находится ли версия в df_l в df_s, затем я хочу обновить значения в df_l.update_date до df_s.release_date . Вот мой код
df_l.ix[df_l['version'].isin(df_s['version']),'update_date'] = df_s['release_date']
но обновленные значения в df_l.update_date неверны, я предполагаю, что сопоставление выполняется неправильно. Кто-нибудь может помочь?
Ответ №1:
IIUC, который вам нужен merge
, с внутренним соединением how='inner'
, которое по умолчанию. Также вы можете опустить on
, если в обоих DataFrames
только 2 столбца, и один из них одинаков в обоих:
print (pd.merge(df_l, df_s))
version update_date release_date
0 2.3.4 date1 date1
1 3.4.5 date2 date2
Комментарии:
1. спасибо за ваш ответ, но я проверяю, находится ли, например, 2.3 из df_l в df_s, который затем будет охватывать, например, 2.3.1 и т.д.
2. Я разговариваю только по телефону до воскресенья. Но я думаю, что вы можете создать
Series
изdf_s
bys=df_s.set_index('version')['release_date']
, а затем сопоставитьdf_l
с ним.df=df_l.set_index('version').map(s)
. Затем получите NaN, когда нет совпадений, поэтому я думаю, что нужноdf=df.combine_first(df_l)
. Это непроверено, но я надеюсь, что я вам помогу.3. Я думаю, вам нужно
[]
подобноеdf=df_l.set_index('version')['update_date'].map(s)
. В предыдущем комментарии это неверно.