如何在多级列DataFrame中添加计算列(Sales=Qty*Price)
多级列DataFrame批量添加按年份计算的Sales列
问题说明
我有一个两级列索引的DataFrame,第一层列名为Qty、Price,第二层为年份(2001-2005),数据结构如下:
import pandas as pd data = {('Qty', 2001): [50, 50], ('Qty', 2002): [100, 10], ('Qty', 2003): [200, 20], ('Qty', 2004): [300, 30], ('Qty', 2005): [400, 40], ('Price', 2001): [20, 11], ('Price', 2002): [21, 12], ('Price', 2003): [22, 13], ('Price', 2004): [23, 14], ('Price', 2005): [24, 15]} df = pd.DataFrame(data)
需要为每个年份批量添加Sales列,值为对应年份的Qty乘以Price,不想拆分每个年份单独处理,求简便方法。预期结果是每个年份下都包含Qty、Price、Sales三列。
解决方案
方法1:按年份列分组计算
利用groupby按第二层列(年份)分组,对每组内的Qty和Price做乘法,再将结果转为多级列合并回原DataFrame:
# 按年份分组计算Sales sales = df.groupby(level=1, axis=1).apply(lambda x: x['Qty'] * x['Price']) # 设置多级列名 sales.columns = pd.MultiIndex.from_tuples([('Sales', year) for year in sales.columns]) # 合并并按年份排序列 df = pd.concat([df, sales], axis=1).sort_index(axis=1, level=1)
方法2:利用多级列索引对齐直接相乘
提取Qty和Price的子DataFrame,直接相乘后转为多级列,这种方法更高效:
# 提取Qty和Price列并按年份相乘 sales = df.xs('Qty', level=0, axis=1) * df.xs('Price', level=0, axis=1) # 转换为多级列结构 sales = sales.set_axis(pd.MultiIndex.from_product([['Sales'], sales.columns]), axis=1) # 合并到原DataFrame并排序列 df = pd.concat([df, sales], axis=1).sort_index(axis=1, level=1)
两种方法都能批量完成所有年份的Sales计算,无需逐个拆分处理。执行后,DataFrame的列会按年份分组,每个年份下包含Qty、Price、Sales三列,符合预期输出。
内容的提问来源于stack exchange,提问作者Nitin
相关产品推荐
相关产品推荐

