Рассмотрим следующие фреймы данных:
df = pd.DataFrame({'code': ['some_code', 'cde', 'another_code', 'cccc', 'code_code'],
'value_to_replace': [600, np.nan, 500, 200, 400]})
from_df = pd.DataFrame({'contains_code': ['sdfgsdfg','has some_code in','has_cde','ggfd','also has some_code'],
'value_to_get': [400, 800, 500, 500, '']})
У меня есть задача обновить value_to_replace
из df
с последним значением из value_to_get
из from_df
, где df['code']
содержится в df_from['contains_code']
, если значение для получения пусто.Я разобрался с подходом, как показано ниже, однако он включает создание временного столбца temp_new_val
, который мне не совсем нравится.Кроме того, этот метод немного медленный, и в будущем будет трудно понять, вернусь ли я к этому коду.Мне интересно, есть ли более разумный способ сделать это, более полный и быстрый.В основном мне интересно, могу ли я сделать это с панда данных update()
.
Это мой подход:
is_contained = lambda x:(list(from_df['value_to_get'][from_df['contains_code']\
.str.lower().str.contains(str(x).lower())])[-1]
if not from_df['value_to_get'][from_df['contains_code']\
.str.lower().str.contains(str(x).lower())].empty
else '')
df['temp_new_val'] = df['code'].map(is_contained)
raplace_if_has_new = lambda row: (row['temp_new_val'] if row['temp_new_val']
else row['value_to_replace'])
df['value_to_replace'] = df.apply(has_reference, axis=1)
df.drop(columns=['temp_new_val'], inplace=True)
Вывод выглядит так:
code value_to_replace
0 some_code 600.0
1 cde 500.0
2 another_code 500.0
3 cccc 200.0
4 code_code 400.0