如何拆分Pandas数据框中的公式列并生成值组合?
处理Pandas公式列的逻辑组合生成
核心思路是把公式拆解为「AND分组」(+分隔的部分),每个分组内的OR选项(/分隔)做笛卡尔积,最终得到所有合法的AND组合。
步骤拆解
- 拆分AND分组:把公式按
+分割,但要保留括号内的完整内容(避免把括号里的+误拆分)。用正则表达式可以精准匹配每个分组:要么是括号包裹的内容,要么是无括号的连续字符。 - 提取OR选项:对每个分组去掉括号,再按
/分割成可选值列表。 - 生成笛卡尔积:用所有分组的可选值列表做笛卡尔积,每个组合用
+连接就是最终结果。
代码实现
import pandas as pd import re from itertools import product def parse_formula(formula): # 匹配每个AND分组:要么是(...),要么是不含括号的连续非+字符 groups = re.findall(r'\([^()]+\)|[^+]+', formula) # 处理每个分组:去括号,按/分割成列表 option_lists = [] for group in groups: # 去掉首尾的括号 cleaned_group = group.strip('()') # 按/分割,去掉空字符串(避免连续/的情况) options = [opt.strip() for opt in cleaned_group.split('/') if opt.strip()] option_lists.append(options) # 生成笛卡尔积,每个组合用+连接 combinations = [' + '.join(combo) for combo in product(*option_lists)] return combinations # 测试示例 df = pd.DataFrame({ 'formula': [ 'ABC+(DEF/GHI/XYZ)', '(ABC/DEF)+(GHI/JKL)' ] }) # 应用函数,展开成新的DataFrame result_df = df['formula'].apply(parse_formula).explode().reset_index(drop=True) print(result_df)
代码说明
re.findall(r'\([^()]+\)|[^+]+', formula):正则优先匹配括号包裹的内容,再匹配不含+的连续字符,完美拆分AND分组。product(*option_lists):itertools的product会生成所有分组选项的笛卡尔积,正好对应AND逻辑的所有组合。explode():把每个公式生成的组合列表拆成单独的行,符合你要的新数据框格式。
测试输出
运行后会得到:
0 ABC + DEF 1 ABC + GHI 2 ABC + XYZ 3 ABC + GHI 4 ABC + JKL 5 DEF + GHI 6 DEF + JKL
内容的提问来源于stack exchange,提问作者kimchg82
相关产品推荐
相关产品推荐

