petl - 如何用零替换空值

时间:2017-05-01 17:10:59

标签: python etl petl

对于petl表,如何用零替换空值?

我希望如下:

tb_probii = etl.fromcsv("data.csv").fill("score", "", 0)

在这里寻找类似的功能: http://petl.readthedocs.io/en/latest/_modules/petl/transform/fills.html

但没有运气:/

2 个答案:

答案 0 :(得分:1)

我不知道这是不是最好的方法。我实在感谢你将petl的存在引起我的注意。

>>> import petl
>>> tb_probii = petl.fromcsv('trial.csv')
>>> tb_probii
+------+-------+
| team | score |
+======+=======+
| 'A'  | ''    |
+------+-------+
| 'B'  | '25'  |
+------+-------+
| 'C'  | '35'  |
+------+-------+

>>> from collections import OrderedDict
>>> mappings = OrderedDict()
>>> def f(s):
...     if s == '':
...         return '0'
...     else:
...         return s
...     
>>> mappings['team'] = 'team'
>>> mappings['score'] = 'score', lambda s: f(s)
>>> tb_probii = petl.fieldmap(tb_probii, mappings)
>>> tb_probii 
+-------+------+
| score | team |
+=======+======+
| '0'   | 'A'  |
+-------+------+
| '25'  | 'B'  |
+-------+------+
| '35'  | 'C'  |
+-------+------+

一些解释: fieldmap执行OrderedDict中包含的映射集合。当我尝试这个时,我做了一个新表的映射。这就是team与自身相同映射的原因。如果你保持相同的表,这可能是不必要的,虽然我不知何故怀疑它。每个映射都是一个元组。 score的一个表示score将通过转换映射到自身。似乎有必要使用lambda;但是,lambdas不能包括if语句。出于这个原因,我为要调用的lambda创建了函数f。我认为这些列是重新排序的,因为容器是一个OrderedDict,并按字典顺序排列列的名称。也许它不一定是OrderedDict,但这是我在文档中找到的。

答案 1 :(得分:1)

我通过电子邮件发送了帮助组python-etl@googlegroups.com,创建者自己回复了一个功能完美的功能:

tb_probii = etl.fromcsv("data.csv").replace("score", "", 0)