У меня есть фрейм данных со столбцом со многими диапазонами значений. Пример ниже:
dirty_col = pd.Series([5, 6, '1-2', '40-60', 10])
Я пытаюсь очистить этот столбец, создав новый столбец со средним значением диапазонов. Ожидаемый результат:
clean_col = pd.Series([5, 6, 1.5, 50, 10])
Я пытаюсь сопоставить это с помощью регулярных выражений в функциях векторизованного отображения, например:
clean_col = pd.Series([5, 6, '1-2', '40-60', 10]).replace({'^[0-9]-[0-9]$':--average here--},regex=True)
Но я застрял здесь. Как я могу получить ожидаемый результат выше, ИСПОЛЬЗУЯ словарь сопоставления и регулярные выражения? Я знаю, что мог бы работать непосредственно в фрейме данных, разделяя текст на «-», а затем усредняя, но у меня уже есть много других сопоставлений очистки внутри вышеуказанного словаря, поэтому было бы удобнее и чище продолжать использовать один и тот же словарь для вся уборка.
Я думаю, что решение, которое я ищу, вероятно, использует лямбда-выражения или дополнительную функцию, которая вызывается из словаря, но я не могу понять, как это сделать.
Я не думаю, что pandas.Series.replace
поддерживает callable. Один из возможных способов использования pandas.eval
:
dirty_col.replace({'^(\d+)-(\d+)$': "(\\1+\\2)/2"},regex=True).apply(pd.eval)
Выход:
0 5.0
1 6.0
2 1.5
3 50.0
4 10.0
dtype: float64
Вы можете попробовать series.str.replace
с repl
в качестве вызываемого и fillna
обратно
f_repr = lambda m: str(sum(map(int, m[0].split('-')))/2)
s_out = s.str.replace(r'^[0-9]+-[0-9]+$', f_repr).fillna(s)
Out[30]:
0 5
1 6
2 1.5
3 50.0
4 10
dtype: object
+1 за ваш вклад, но, как я объясняю в посте выше, я искал решение на основе словаря. С уважением.