Удаление нескольких подстрок в столбце данных pandas - PullRequest
0 голосов
/ 09 октября 2018

У меня есть столбец ингредиентов в кадре данных панд.Мне нужно удалить все, кроме названия ингредиента (например: 1/3 чашки кешью> кешью).

Ввод

    recipe_name                                ingredient
0   Truvani Chocolate Turmeric Caramel Cups    ⅓ cup cashews
1   Truvani Chocolate Turmeric Caramel Cups    4 dates
2   Truvani Chocolate Turmeric Caramel Cups    1 tablespoon almond butter
3   Truvani Chocolate Turmeric Caramel Cups    3 tablespoons coconut milk
4   Truvani Chocolate Turmeric Caramel Cups    ½ teaspoon vanilla extract

Ожидаемый результат

    recipe_name                                ingredient
0   Truvani Chocolate Turmeric Caramel Cups    cashews
1   Truvani Chocolate Turmeric Caramel Cups    dates
2   Truvani Chocolate Turmeric Caramel Cups    almond butter
3   Truvani Chocolate Turmeric Caramel Cups    coconut milk
4   Truvani Chocolate Turmeric Caramel Cups    vanilla extract 

Я пытался использовать словарь с общими словами, сопоставленными с пустыми строками, например:

remove_list ={'\d+': '', 'ounces': '', 'ounce': '', 'tablespoons': '', 'tablespoon': '', 'teaspoons': '', 'teaspoon': '', 'cup': '', 'cups': ''}
column = df['ingredient']
column.apply(lambda column: [remove_list[y] if y in remove_list else y for y in column])

Это вообще не изменило данные.

Я также пытался использовать регулярное выражение:

df['ingredients'] = re.sub(r'|'.join(map(re.escape, remove_list)), '', df['ingredients'])

Но это просто выдает ошибку «TypeError: ожидаемая строка или буфер».

Я очень новичок вPython, так что я думаю, что это возможно с помощью регулярных выражений, я просто не знаю, как это сделать.

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Поскольку вы хотите заменить все одним и тем же символом, просто поместите их в список.

l = ['\d+', '[^\x00-\x80]+', 'ounces', 'ounce', 'tablespoons', 
     'tablespoon', 'teaspoons', 'teaspoon', 'cup', 'cups']

Затем используйте один replace, объединяя все.

df.ingredient.str.replace('|'.join(l), '', regex=True).str.strip()
# Safer to only replace stand-alone words. strip not needed
#df.ingredient.str.replace('|'.join([x + '\s' for x in l]), '', regex=True)

Вывод:

0            cashews
1              dates
2      almond butter
3       coconut milk
4    vanilla extract
Name: ingredient, dtype: object

Я добавил '[^\x00-\x80]+' в список, чтобы удалить эти дробные символы, а .str.strip удаляет все лишние или начальные пробелы после замен.

0 голосов
/ 09 октября 2018

Вы можете использовать цикл и метод .split():

i = 0
for row in df['ingredient']:
    item = row.split(sep=' ', maxsplit=1)
    df['ingredient'].loc[i] = item[1]
    i += 1

Вывод будет:

    recipe_name                                ingredient
0   Truvani Chocolate Turmeric Caramel Cups    cup cashews
1   Truvani Chocolate Turmeric Caramel Cups    dates
2   Truvani Chocolate Turmeric Caramel Cups    tablespoon almond butter
3   Truvani Chocolate Turmeric Caramel Cups    tablespoons coconut milk
4   Truvani Chocolate Turmeric Caramel Cups    teaspoon vanilla extract

Если вы хотите сохранить измерения, вы можете создать дубликатв столбце и в одном столбце сохраняются значения, а в другом - ингредиент.

0 голосов
/ 09 октября 2018

Для этого есть набор строковых функций, встроенных в рамки данных панд.

Что-то вроде этого должно работать:

df['ingredient'] = df['ingredient'].str.replace('\d+', '', regex=True)

Я не знаю, можно ли использовать dict сэто, возможно, вам придется перебирать свой словарь, чтобы получить все замены, которые вы хотите.

for ptn, rpl in remove_list.items():
    df['ingredient'] = df['ingredient'].str.replace(ptn, rpl, regex=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...