多层索引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
相关产品推荐
相关产品推荐

