Python map()和reduce()清洗数据

Python 使用map()和reduce()清洗数据,清洗数据时经常需要引入复杂度不同的过滤器来剔除无效数据,下面通过定义映射将有效但格式不规范的数据,转换为有效且格式规范的数据。

首先定义如下函数:

def comma_fix(data: str) -> float:
    try:
        return float(data)
    except ValueError:
        return float(data.replace(",", ""))

def clean_sum(
        cleaner: Callable[[str], float],
        data: Iterable[str]
    ) -> float:
    return reduce(operator.add, map(cleaner, data))

comma_fix()函数通过去掉字符串中的逗号,将格式不规范的表达数字的字符串转换为实数,类似的场景还有去掉字符串中的$符号并转换为decimal.Decimal类型数据。

然后可以将一个执行清洗操作的映射函数(这里是comma_fix()类)应用于数据,再用operator.add方法进行归约。

清洗过程如下所示:

>>> d = ('1,196', '1,176', '1,269', '1,240', '1,307',
... '1,435', '1,601', '1,654', '1,803', '1,734')
>>> clean_sum(comma_fix, d)
14415.0

这样就通过修正逗号实现了清洗数据并计算总和,组合两项操作的语法也很简单。

请注意,应避免多次调用清洗函数,比如计算一组数据的平方和时,不应执行如下命令:

comma_fix_squared = lambda x: comma_fix(x) ** 2

由于计算数据的标准差时也要用到clean_sum(comma_fix, d)方法,就执行了两次修正逗号的操作,一次计算数据总和,一次计算平方和,这样的算法设计很差。用lru_cache装饰器缓存计算结果会有帮助,更好的方法是将清洗的中间结果实例化到临时的元组对象中。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程