我有一个配置yaml文件,应该由客户使用,并且易于编辑。在yaml文件中有一些规则:
variables:
used_often: ['good','bad', 3]
rules:
- dataframe_name: my_name
variables:
consequence: used_often
query: 'column_a = 5 and column_b in ${consequence} and column_c != 1'
output: {'column_d': 1}
- more rules like this
正如你在这里看到的,我想过滤my_name
等df column_a = 5
中的3列,然后在这个过滤器的结果中添加/更改column_d
,以便匹配查询的所有行都有column_d = 1
。
我的问题是如何使查询更容易使用pandas进行过滤。就目前而言,上面的查询最终应该像这样的熊猫:
my_name[(my_name["column_a"] == 5) &
(my_name["column_b"].isin(['good','bad', 3])) &
(my_name["column_c"] != 1)]
所以我必须做很多处理来解释yaml中的查询。是否有任何工具可以帮助我或更好的方式格式化查询(只要客户端编写它是合理的,我完全可以自由地构建yaml文件)?
谢谢!
有一个pandas.query函数可以完成所有https://pandas.pydata.org/pandas-docs/version/0.22/generated/pandas.DataFrame.query.html
所以我在yaml的查询变为:
query: 'column_a == 5 and column_b in @consequence and column_c !=1'
然后在python中我可以读取yaml和filter:
df.query(my_query)