我有以下列表和数据框:

import pandas as pd
cols = pd.MultiIndex.from_tuples([("K", "A1", "A"), 
                                  ("K", "B1", "B"), 
                                  ("K", "C1", "C"),
                                  ("M", "A1", "A"), 
                                  ("M", "B1", "B"), 
                                  ("M", "C1", "C")])

data = [[5, 10, 40, 4, 8, 9], [2, 15, 70, 1, 7, 3], [6, 14, 60, 12, 41, 61]]
df = pd.DataFrame(data, columns=cols)
lst = [5, '*', 'A1.A', '+', 'C1.C']

列多索引名称在列表中列出的方式可以更改,如果可以提供帮助的话.

我想创建一个代码来执行第一个类似5 x df['A1','A'] + df['C1','C']的等式,但对于匹配第二级和第三级的所有列组合,返回以下结果:

df[("K", "N1", "N")] = 5 * df[("K", "A1", "A")] + df[("K", "C1", "C")]
df[("M", "N1", "N")] = 5 * df[("M", "A1", "A")] + df[("M", "C1", "C")]

这有可能吗?

推荐答案

您可以在第一个列级唯一键上使用pandas.eval和循环:

df_name = 'df'

for key in df.columns.get_level_values(0).unique():
    query = ''.join([f'{df_name}.{key}.{x}' if (isinstance(x, str) and '.' in x)
                     else str(x)
                     for x in lst])
    df[(key, 'N1', 'N')] = pd.eval(query)

df = df.sort_index(axis=1, level=0, sort_remaining=False)

print(df)

当然,如果您不需要从列表构建它,您可以简化为:

for key in df.columns.get_level_values(0).unique():
     df[(key, 'N1', 'N')] = 5 * df[(key, "A1", "A")] + df[(key, "C1", "C")]

输出:

   K               M             
  A1  B1  C1  N1  A1  B1  C1   N1
   A   B   C   N   A   B   C    N
0  5  10  40  65   4   8   9   29
1  2  15  70  80   1   7   3    8
2  6  14  60  90  12  41  61  121

Python-3.x相关问答推荐

使用递归将int转换为字符串

regexp多重前瞻行为的解释

对大型数据框中的选定列进行重新排序

从一列字符串中提取子字符串并将它们放入列表中

使用 python 查找标记的元素

根据另一个数据帧中的位置从主数据帧中提取子序列

如何在 Python 中 cv2 的窗口标题上动态更新 FPS

获取字符串中的两个工作日之间的差异

使用大型多个数据集,其中每个数据集包含多个值 - Pytorch

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

python中两个连续的yield语句如何工作?

在python中基于列表理解的条件下跳过元素

Python 3.9.8 使用 Black 并导入 `typed_ast.ast3` 失败

具有两个或多个返回参数的函数注释

TypeError:列表索引必须是整数或切片,而不是列表

BeautifulSoup 的 Python 3 兼容性

如何使用已打开并使用登录凭据登录的浏览器

python中的订单字典索引

清除 PyCharm 运行窗口

TypeError:无法实例化类型元组;使用 tuple() 代替