Преобразование строкового значения в диапазон
Есть объект Dataframe считанный из загруженного csv файла по ссылке:
df = pd.read_csv("Химический анализ родника в Нескучном саду.csv", sep=',')
df
Задача - добавить столбец, который сравнивает данные из столбца Результат анализа со столбцом Норматив. Для этого очищаю столбец Норматив для дальнейшей работы.
df["Res"] = df["Норматив"].str.replace(r"в пределах", "", regex=True)
df["Res"] = df["Res"].str.replace(r"не более", "", regex=True)
df
А дальше не понимаю как двигаться: что делать со значениями с дефисом (напр. 6-9), есть ли способ перевести их в диапазон и проверять входит ли результат анализа в этот диапазон?
Ответы (1 шт):
Автор решения: Алексей Р
→ Ссылка
На коленке, но как-то так
pd.options.display.width = None
df = pd.read_csv("Химический анализ родника в Нескучном саду.csv", sep=',')
# нормализация
df["Res"] = df["Норматив"].str.replace(r"в пределах (\d+)-(\d+)", r"\1:\2", regex=True).str.replace(r"не более.+?(\d+,?\d*)$", r"0:\1", regex=True)
df['Результат анализа'] = df['Результат анализа'].replace('б/цвета', '0')
# формирование верхней и нижней границ
df[['lower', 'upper']] = df["Res"].str.replace(',', '.').str.extract(r'(.*):(.*)')
# формирование выводов
df['Норма'] = df['Результат анализа'].astype(float).between(df.lower.astype(float), df.upper.astype(float))
print(df)
Показатель Единица измерений Результат анализа Норматив Res lower upper Норма
0 pH единицы pH 8.4 в пределах 6-9 6:9 6 9 True
1 Запах баллы 1 не более 2-3 0:3 0 3 True
2 Цветность градусы 0 не более 30 0:30 0 30 True
3 Жёсткость мг-эквл/дм3 9.199999999999999 в пределах 7-10 7:10 7 10 True
4 Аммиак и аммоний-ион (по азоту) мг/дм3 0.42 не более 1,5 0:1,5 0 1.5 True
5 Нитриты (по NO2) мг/дм3 0.017 не более 3,3 0:3,3 0 3.3 True
6 Нитраты (по NO3) мг/дм3 24 не более 45 0:45 0 45 True
7 Фосфаты (P) мг/дм3 0.36 не более 3,5 0:3,5 0 3.5 True
8 Хлориды (Cl) мг/дм3 200 не более 350 0:350 0 350 True
9 Сульфаты (SO4) мг/дм3 189.5 не более 500 0:500 0 500 True
10 Железо (включая хлорное железо) по Fe мг/дм3 0.019 не более 0,3 0:0,3 0 0.3 True
11 Нефть мг/дм3 0.55 не более 0,3 0:0,3 0 0.3 False
12 Общая минерализация (сухой остаток) мг/дм3 590 не более 1000 0:1000 0 1000 True
13 Окисляемость перманганатная мг/дм3 2 не более 0,5 0:0,5 0 0.5 False
