如何用 Jinja 默认过滤器替换 NaN?

How to replace NaN with Jinja default filter?

我正在尝试使用 default filter in Jinja2 将缺失值替换为默认值。

原来我的数据源有一些 NaN,而不仅仅是缺失值。 对于我的用例,我想用默认值替换 NaN。 但是 default 过滤器只是通过 NaN 而没有替换。

Jinja2 中是否有任何过滤器可以让我轻松地将 NaN 值替换为其他值? (当然我可以写一个自定义过滤器,我只是想知道是否有更简单的解决方案。)

对于上下文,我是从 Ansible 做的,它有 a few more filters available than plain Jinja2.

MWE

playbook.yaml

---
- hosts: localhost
  connection: local
  tasks:
  - name: generate cloudformation template
    template:
      src: input.j2
      dest: output.txt
    vars:
      data:
        - value: 123
          comment: this is an integer
        - value: None
          comment: This is None
        - value: NaN
          comment: This is NaN
        - comment: this is missing
        - value: ''
          comment: empty string

input.j2

{% for row in data %}
{{ row['comment'] }}
{{ row['value'] | default('default') }}
{{ row['value'] | default('default', boolean=True) }}

{% endfor %}

运行 与:

ansible-playbook playbook.yaml
cat output.txt

实际行为

this is an integer
123
123
123

This is None
None
None
default

This is NaN
NaN
default
default

this is missing
default
default
default

empty string

default
default

期望的行为

...

This is NaN
NaN
default
default

...

(最好也有一个替代 Nones 的解决方案。我不确定为什么 None | default('x', boolean=True) 不这样做,因为 None 是错误的。 )

默认 过滤器不会在这里帮助您。自定义过滤器可能是简化代码的好主意。但是,您也可以使用当前过滤器转换数据。

例如属性缺失先添加默认值

_data_default:
  - value: default
_data: "{{ _data_default|product(data)|map('combine')|list }}"
_data:
  - comment: this is an integer
    value: 123
  - comment: This is None
    value: None
  - comment: This is NaN
    value: NaN
  - comment: this is missing
    value: default
  - comment: empty string
    value: ''

替换值

_regex: '^NaN|None|null$'
_regex_empty: '^$'
_replace: default
_data_values: "{{ _data|map(attribute='value')|
                  map('regex_replace', _regex, _replace)|
                  map('regex_replace', _regex_empty, _replace)|
                  map('community.general.dict_kv', 'value')|list }}"
_data_values:
  - value: '123'
  - value: default
  - value: default
  - value: default
  - value: default

并合并列表中的项目

data2: "{{ data|zip(_data_values)|map('combine')|list }}"
data2:
  - comment: this is an integer
    value: '123'
  - comment: This is None
    value: default
  - comment: This is NaN
    value: default
  - comment: this is missing
    value: default
  - comment: empty string
    value: default

根据您的需要调整选项并将变量设置为 appropriate