Создание новой колонки по условию 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 шт):
Например, так:
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