У меня есть некоторый код конвейера данных, который применяет логику преобразования / очистки к столбцам кадра данных Pandas на основе их имени.
Прямо сейчас я перебираю столбцы, используя df.iteritems()
, что согласно этому руководству по оптимизации функций применения Pandas лучше, чем грубое зацикливание, но является "наименее эффективным способом запуска большинства стандартных функций". .
Я бы хотел улучшить производительность этого кода, либо воспользовавшись возможностью Pandas векторизовать эти операции, либо другим параллельным подходом.
Все сработанные примеры, которые я видел, иллюстрируют, как это сделать по строкам (например, вычислить на Серии вместо вычисления на одной строке), но я не смог найти хороший пример того, как это сделать по столбцам .
Вот воспроизводимый / игрушечный пример с использованием набора данных Бостона из scikit learn. Желаемым результатом является реализация логики очистки в векторизованном / параллельном режиме (без использования .iteritems()
или циклов). Спасибо!
from typing import Callable
# sample df from sklearn
from sklearn import datasets
boston = datasets.load_boston()
boston = pd.DataFrame(boston.data, columns=boston.feature_names)
boston.head()
def double_it(col: pd.Series) -> pd.Series:
return col.multiply(2)
def make_string(col: pd.Series) -> pd.Series:
return col.astype(str)
def do_nothing(col: pd.Series) -> pd.Series:
return col
def match_cleaner(col_name: str) -> Callable:
if col_name in ['ZN', 'NOX', 'INDUS', 'AGE']:
return double_it
elif col_name in ['TAX', 'DIS', 'CHAS', 'PTRATIO']:
return make_string
else:
print(col_name)
return do_nothing
for key, value in boston.iteritems():
cleaning_func = match_cleaner(key)
boston.loc[:, key] = cleaning_func(value)
# confirm changes
boston.head()
print(boston.dtypes)