如何为已有多级列的DataFrame添加新的列层级?
问题:为多级列添加新层级时抛出NotImplementedError错误
原始DataFrame结构
x A B 0 0 1 1 2 3 2 4 5 3 6 7 4 8 9
尝试的代码
x.columns = pd.MultiIndex.from_product([['D'], x.columns])
错误信息
Traceback (most recent call last): File "C:\Users\adel.moustafa\DashBoard\main.py", line 262, in <module> calculate_yield() File "C:\Users\adel.moustafa\DashBoard\main.py", line 204, in calculate_yield Analyzer.yield_analyzer_by(yield_data, all_data_df, df_info['P/F Criteria'], 'batch') File "C:\Users\adel.moustafa\DashBoard\Modules\Analyzer.py", line 163, in yield_analyzer_by x.columns = pd.MultiIndex.from_product([['D'], x.columns]) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\multi.py", line 621, in from_product codes, levels = factorize_from_iterables(iterables) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\arrays\categorical.py", line 2881, in factorize_from_iterables codes, categories = zip(*(factorize_from_iterable(it) for it in iterables)) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\arrays\categorical.py", line 2881, in <genexpr> codes, categories = zip(*(factorize_from_iterable(it) for it in iterables)) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\arrays\categorical.py", line 2854, in factorize_from_iterable cat = Categorical(values, ordered=False) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\arrays\categorical.py", line 451, in __init__ dtype = CategoricalDtype(categories, dtype.ordered) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\dtypes.py", line 183, in __init__ self._finalize(categories, ordered, fastpath=False) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\dtypes.py", line 337, in _finalize categories = self.validate_categories(categories, fastpath=fastpath) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\dtypes.py", line 530, in validate_categories if categories.hasnans: File "pandas\_libs\properties.pyx", line 37, in pandas._libs.properties.CachedProperty.__get__ File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2681, in hasnans return bool(self._isnan.any()) File "pandas\_libs\properties.pyx", line 37, in pandas._libs.properties.CachedProperty.__get__ File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2666, in _isnan return isna(self) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\missing.py", line 144, in isna return _isna(obj) File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\dtypes\missing.py", line 169, in _isna raise NotImplementedError("isna is not defined for MultiIndex") NotImplementedError: isna is not defined for MultiIndex
可复现代码
import pandas as pd import numpy as np x = pd.DataFrame(np.arange(10).reshape(5, 2), columns=pd.MultiIndex.from_product([['x'], ['A', 'B']])) x.columns = pd.MultiIndex.from_product([['D'], x.columns])
问题原因
pd.MultiIndex.from_product要求传入的是单层可迭代序列,但你传入的x.columns本身是MultiIndex多层索引对象。内部处理时会尝试对这个MultiIndex执行isna检查,而pandas不支持直接对MultiIndex调用isna方法,因此抛出错误。
解决方法
给已有的多级列添加顶层,推荐两种方法:
方法一:使用insert方法直接插入新层级
# 在第0层(顶层)插入新元素'D' x.columns = x.columns.insert(0, 'D', level=0)
方法二:构造新的元组列表生成MultiIndex
将原有列的每个元组前拼接新层级元素,再转为MultiIndex:
new_columns = [('D',) + col for col in x.columns] x.columns = pd.MultiIndex.from_tuples(new_columns)
执行后,新的列结构为:
D x A B 0 0 1 1 2 3 2 4 5 3 6 7 4 8 9
内容的提问来源于stack exchange,提问作者Adel Moustafa
相关产品推荐
相关产品推荐

