Как обновить pandas с помощью vlookup, если возвращаемое значение не пустое? - PullRequest
1 голос
/ 23 мая 2019

Рассмотрим следующие фреймы данных:

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
...