Создание новой колонки по условию Python

Имеется таблица Excel, содержащая колонку Фрукты с описанием продукта, например "Яблоко зеленое спелое", "Яблоко красное спелое", "Груша зеленая кислая". Как должен выглядеть код, либо условие, что бы можно на выходе получить новую колонку B, в которой по ключевым словам "Яблоко" "зеленое" присваивался бы индекс 1.1, по "Яблоко" "красное" индекс 1.2, а по "Груша" и "кислая" допустим 2.1.

Пока получилось только создать код, который выводит новую таблицу, где выгружаются строки содержащие значения "яблоко" и "зеленое".

import pandas as pd
import numpy as np
import re

df=pd.read_excel(r'C:\frukty\apple_.xlsx', dtype='str')
r=r'(Яблоко)|(зеленое)'
apple=df['Описание'].apply(lambda x: re.search(r,str(x).lower()))
itog=np.any(np.array([~apple.isnull()]),axis=0)
new_df=df[itog]
new_df.to_excel('new_file.xlsx',index=False)

Новый код:

import pandas as pd
import numpy as np
import re

desc_to_index={
'(?=.*яблоко)(?=.*зеленое)':'1.1',
'(?=.*яблоко)(?=.*красное)':'1.2',
'(?=.*груша)(?=.*кислая)':'1.3',
}

def get_index(text):
    text=text.lower()
    for desc, index in desc_to_index.items():
        if re.search(desc, text):
            return index
    return pd.NA

df=pd.read_excel(r'C:\fruit\apple_.xlsx', dtype='str')
df['Индекс']=df['Описание'].map(get_index)
df.to_excel('tip2.xlsx',index=False)

Ответы (2 шт):

Автор решения: CrazyElf

Например, так:

import pandas as pd
import re

desc_to_index = {
"(?=.*яблоко)(?=.*зеленое)": "1.1",
"(?=.*яблоко)(?=.*красное)": "1.2",
"(?=.*груша)(?=.*кислая)": "2.1",
}

def get_index(text):
    text = text.lower()
    for desc, index in desc_to_index.items():
        if re.search(desc, text):
            return index
    return pd.NA

df = pd.DataFrame({'Описание': ["Яблоко жёлтое", "Яблоко зеленое", "Яблоко красное", "Груша кислая", "Груша сладкая"]})
df['Индекс'] = df['Описание'].map(get_index)
df

Вывод:

    Описание        Индекс
0   Яблоко жёлтое   <NA>
1   Яблоко зеленое  1.1
2   Яблоко красное  1.2
3   Груша кислая    2.1
4   Груша сладкая   <NA>

К сожалению операция "и" в регулярных выражениях описывается вот так сложно. А вам ведь нужна она, а не использованная вами операция "или".

→ Ссылка
Автор решения: Алексей Р
df = pd.DataFrame( {'Наименование': ['Яблоко зеленое спелое', 'Яблоко красное спелое', 'Груша зеленая кислая']} )
d = {'яблоко': 10, 'груша': 20, 'зеленое': 1, 'красное': 2, 'кислая': 1}
df['Индекс'] = df['Наименование'].str.lower().str.split().apply(lambda x: str(sum(d.get(n, 0) for n in x) / 10))
print(df)
            Наименование Индекс
0  Яблоко зеленое спелое    1.1
1  Яблоко красное спелое    1.2
2   Груша зеленая кислая    2.1
→ Ссылка