【发布时间】:2019-06-04 12:08:02
【问题描述】:
我有一些数据管道代码,它们根据名称将转换/清理逻辑应用于 Pandas 数据框的列。
现在我正在使用 df.iteritems() 对列进行迭代,根据 this guide 关于优化 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)
【问题讨论】:
标签: python python-3.x pandas parallel-processing vectorization