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
相关产品推荐
相关产品推荐

