堆叠含多级表头的Pandas DataFrame时遇TypeError问题求助
解决Pandas多级表头混合类型导致
stack()报错的问题 你猜的没错!这个错误确实是因为二级表头混合了字符串和整数类型导致的——Pandas的stack()操作会尝试对列层级进行排序,而字符串和整数无法直接比较大小,所以才抛出了TypeError: '<' not supported between instances of 'str' and 'int'这个错误。
下面针对你的两种场景(手动创建DataFrame、从Excel读取DataFrame)给出具体的解决方案:
场景1:手动创建多级表头的DataFrame
如果是像示例里手动构建MultiIndex,你可以在创建时直接把二级表头的所有元素转为字符串:
import pandas as pd # 创建时统一将二级表头元素转为字符串 multicol = pd.MultiIndex.from_tuples([('Car', str('Megane')), ('Car', str(5008))]) df = pd.DataFrame([[1, 2], [2, 4]], index=['Diesel', 'Escence'], columns=multicol) # 现在执行stack()就不会报错了 stacked_df = df.stack()
如果已经创建好了DataFrame,也可以事后修改二级表头的类型:
# 针对已有的df,将二级列索引全部转为字符串 df.columns = df.columns.set_levels(df.columns.levels[1].astype(str), level=1) # 执行stack操作 stacked_df = df.stack()
场景2:从Excel读取多级表头的DataFrame
对于从Excel导入的DataFrame,你可以在读取完成后直接处理列的MultiIndex:
import pandas as pd # 读取Excel,header=[0,1]表示前两行是多级表头 df = pd.read_excel('your_excel_file.xlsx', header=[0,1]) # 把二级表头的所有元素转为字符串 df.columns = df.columns.set_levels(df.columns.levels[1].astype(str), level=1) # 现在执行stack()操作就正常了 stacked_df = df.stack()
关键说明
set_levels()方法可以精准地修改MultiIndex中指定层级的元素类型:
level=1表示我们要修改的是二级表头(如果要修改一级表头,就用level=0)astype(str)会把该层级的所有元素统一转为字符串类型,确保所有元素类型一致,避免排序时的类型冲突
内容的提问来源于stack exchange,提问作者Charles R
相关产品推荐
相关产品推荐

