You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何基于列表与多层索引DataFrame执行算式?

问题:基于多层索引DataFrame执行列表中的算式

我有如下多层索引DataFrame和列表:

import pandas as pd
cols = pd.MultiIndex.from_tuples([("A1", "A"), 
                                  ("B1", "B"), 
                                  ("C1", "C")])
data = [[5, 10, 40], [2, 15, 70], [6, 14, 60]]
df = pd.DataFrame(data, columns=cols)
lst = [5, '*', 'A1.A', '+', 'C1.C']

希望编写代码执行列表对应的算式(即 5 * df['A1','A'] + df['C1','C']),得到如下结果:

data = [[65], [80], [90]]
dresult = pd.DataFrame(data, columns=['M'])

请问是否可行?


解决方案:可行,实现方法如下

核心思路是将列表中的元素转换为可执行的表达式,其中需要把A1.A这类字符串映射为DataFrame的多层索引列引用。具体步骤:

  • 定义转换函数,把X.Y格式的列名转为df[('X','Y')]的形式
  • 遍历列表,替换所有列名字符串为对应的DataFrame索引引用
  • 将处理后的列表拼接成表达式字符串,通过eval执行计算
  • 将计算结果整理为目标格式的DataFrame

代码实现:

import pandas as pd

# 初始化多层索引DataFrame
cols = pd.MultiIndex.from_tuples([("A1", "A"), 
                                  ("B1", "B"), 
                                  ("C1", "C")])
data = [[5, 10, 40], [2, 15, 70], [6, 14, 60]]
df = pd.DataFrame(data, columns=cols)
lst = [5, '*', 'A1.A', '+', 'C1.C']

# 转换列名字符串为DataFrame索引引用
def convert_col(col_str):
    if isinstance(col_str, str) and '.' in col_str:
        level1, level2 = col_str.split('.')
        return f"df[('{level1}', '{level2}')]"
    return str(col_str)

# 构建并执行表达式
expr = ' '.join(convert_col(item) for item in lst)
result_series = eval(expr)

# 转换为目标DataFrame
dresult = pd.DataFrame(result_series, columns=['M'])

print(dresult)

执行后输出结果:

M
0  65
1  80
2  90

注意:eval会执行任意字符串代码,若列表内容来自不可信来源,存在安全风险。这种情况下建议使用ast模块解析表达式,避免注入问题。

内容的提问来源于stack exchange,提问作者Thanasis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 16:05:27