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

多层索引DataFrame按指定层级求和,缺失数据显示0

解决多层索引DataFrame求和并显示缺失组合0值的问题

要实现你想要的效果,核心思路是先构建所有可能的层级组合,再将求和结果与这个完整组合对齐,缺失的部分填充为0。下面是具体的分步解决方案:

步骤1:处理原始数据并构建索引

先按照你的需求处理原始DataFrame,设置多层索引并移除不需要的列:

import pandas as pd
d = {'City': ['Tokyo','Tokyo','Lisbon','Tokyo','Madrid','New York','Madrid','London','Tokyo','London','Tokyo'], 
     'Card': ['Visa','Visa','Visa','Master Card','Bitcoin','Master Card','Bitcoin','Visa','Master Card','Visa','Bitcoin'], 
     'Colateral':['Yes','Yes','No','No','Yes','No','No','Yes','Yes','No','Yes'], 
     'Client Number':[1,2,3,4,5,6,7,8,9,10,11], 
     'Total':[100,100,200,300,10,20,40,50,60,100,500]}
df = pd.DataFrame(data=d)
# 设置三层索引并删除Client Number列
df_indexed = df.set_index(['City','Card','Colateral']).drop(['Client Number'], axis=1)

步骤2:生成完整的层级组合索引

我们需要先获取所有City和Card的唯一值,然后生成它们的笛卡尔积(也就是所有可能的组合),作为完整的MultiIndex:

# 获取所有唯一的城市和卡种
all_cities = df['City'].unique()
all_cards = df['Card'].unique()
# 生成所有可能的City-Card组合的MultiIndex
full_index = pd.MultiIndex.from_product([all_cities, all_cards], names=['City', 'Card'])

步骤3:求和并填充缺失值

先按City和Card层级求和,再通过reindex将结果对齐到完整索引,缺失的组合自动填充0:

# 按City和Card层级求和
summed_data = df_indexed.sum(level=['City', 'Card'])
# 对齐到完整索引,缺失值填充0
final_result = summed_data.reindex(full_index, fill_value=0)

验证结果

运行后你会看到,比如New York和Bitcoin的组合(原数据中不存在)会显示Total: 0,所有City和Card的组合都会被包含进来。

另外也可以用更简洁的unstack+stack写法(适合简单场景):

final_result = df_indexed.sum(level=['City', 'Card']).unstack(fill_value=0).stack()

不过这种方法如果存在某个City没有任何Card数据的情况,可能不会包含该City的所有组合,所以还是用from_product生成完整索引的方法更可靠。

内容的提问来源于stack exchange,提问作者Tiago Emanuel Pratas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 11:07:28