所以我在pandas中有一个数据框,它由一个包含Components的列和一个包含Constraints的行组成。这些约束决定了必须在什么类别中过滤组件。现在这些约束不是很直接,所以我正在寻找一种方法将它们拆分为多个更小、更可读的约束。例如,如果一个约束是'A and(B or C)',我想分成两行'A and B'和'A and C'。但并非所有约束都像本例一样简单。
下面是dataframe的一小部分可能的样子:
| 成分|约束|
| --------------|--------------|
| 一百二十三|A和(B或C)|
| 四五六|((MIRROR ='ELECTRIC' and MIRRORCAMERA!='NO')或(MIRROR ='MANUAL'和(MIRROR_RIGHT!='NO'或MIRROR_LEFT!='NO')))和STEERWHEEL_LOCK='NO'|
| 七八九|LENGTH='122' or(LENGTH='135' and BATTERY='551')or LENGTH='149' or(LENGTH='181' and(BATTERY='674' or(BATTERY='551' and CHARGER!='NO')))|
或
import pandas as pd
dataex = {'Component': [123,
456,
789],
'Constraint': ["A and (B or C)",
"((MIRROR='ELECTRIC' and MIRRORCAMERA!='NO') or (MIRROR='MANUAL' and (MIRROR_RIGHT!='NO' or MIRROR_LEFT!='NO'))) and STEERWHEEL_LOCK='NO'",
"LENGTH='122' or (LENGTH='135' and BATTERY='551') or LENGTH='149' or (LENGTH='181' and (BATTERY='674' or (BATTERY='551' and CHARGER!='NO')))"]}
df_example = pd.DataFrame(data=dataex)
就像我说的,我希望根据约束中的and和or和括号将所有这些拆分为多行(如果需要的话)。因此,我有以下结果:
| 组件|约束|
| --------------|--------------|
| 一百二十三|A和B|
| 一百二十三|A和C|
| 四五六|STEERWHEEL_LOCK ='NO'和MIRROR ='ELECTRIC'和MIRRORCAMERA!='没有'|
| 四五六|STEERWHEEL_LOCK ='NO'和MIRROR ='MANUAL'和MIRROR_RIGHT!='否'|
| 四五六|STEERWHEEL_LOCK ='NO'和MIRROR ='MANUAL'和MIRROR_LEFT!='没有'|
| 七八九|长度='122'|
| 七八九|长度='135'和电池='551'|
| 七八九|长度='149'|
| 七八九|长度='181'和电池='674'|
| 七八九|长度='181'和电池='551'和充电器!='否'|
或
import pandas as pd
datares = {'Component':[123, 123, 456, 456, 456, 789, 789, 789, 789, 789],
'Constraint':["A and B",
"A and C",
"STEERWHEEL_LOCK='NO' and MIRROR='ELECTRIC' and MIRRORCAMERA!='NO'",
"STEERWHEEL_LOCK='NO' and MIRROR='MANUAL' and MIRROR_RIGHT!='NO'",
"STEERWHEEL_LOCK='NO' and MIRROR='MANUAL' and MIRROR_LEFT!='NO'",
"LENGTH='122'",
"LENGTH='135' and BATTERY='551'",
"LENGTH='149'",
"LENGTH='181' and BATTERY='674'",
"LENGTH='181' and BATTERY='551' and CHARGER!='NO'"
]}
df_result = pd.DataFrame(data=datares)
我试过拆分'or'上的约束,然后将它们分成数组,然后在它们上循环以获得结果,但对于一些更困难的约束,你会得到数组中的数组中的数组,然后过一段时间就会变得非常混乱。我也试过做一种逻辑树,但我还没有让它在Python中工作。
我希望你们中的一些人可能有一个好主意或模块来帮助我解决我的问题。谢谢!
1条答案
按热度按时间kq4fsx7k1#
从你的描述中,我认为你需要把表达式放在“析取范式”(DNF)中,它看起来像Or(And(v1,v2),And(v1,v4),...)。下面的代码将使用一个额外的包来完成这一点(DNF在电子设计自动化中很常见)。要安装软件包,请执行
pip3 install pyeda
。将表达式拆分为相应的And表达式的代码如下所示。
备注:
总体思路:
它将打印: