替换 Pandas MultiIndex 的所有级别中的 NaN 值
Replace NaN values in all levels of a Pandas MultiIndex
在使用 MultiIndex 读取 excel sheet 后,我得到 np.nan 出现在索引中,因为一些值是 'N/A' 和 pd.read_excel 认为转换它们是个好主意。但是我想将它们保留为 'N/A' 以保留多索引。我认为使用 MultiIndex.fillna 很容易将它们改回原来的状态,但我收到此错误:
index = pd.MultiIndex(levels=[[u'foo', u'bar'], [u'one', np.nan]],
codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=[u'first', u'second'])
df = pd.DataFrame(index=index, columns=['A', 'B'])
df
df.index.fillna("N/A")
输出:
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
<ipython-input-17-09e14dcdc74f> in <module>
----> 1 df.index.fillna("N/A")
/anaconda3/envs/torch/lib/python3.7/site-packages/pandas/core/indexes/multi.py in fillna(self, value, downcast)
1456 fillna is not implemented for MultiIndex
1457 """
-> 1458 raise NotImplementedError("isna is not defined for MultiIndex")
1459
1460 @Appender(_index_shared_docs["dropna"])
NotImplementedError: isna is not defined for MultiIndex
更新:
代码已更新以反映 Pandas 1.0.2。在版本 0.24.0 之前,pd.MultiIndex
的 codes
属性被称为 labels
。此外,回溯详细信息从 isnull is not defined
更改为 isna is not defined
如上所述。
使用set_levels
df.index.set_levels([l.fillna('N/A') for l in df.index.levels], inplace=True)
df
当前的解决方案在具有多级列时对我不起作用。我所做的和为我工作的是以下内容:
df.columns = pd.MultiIndex.from_frame(df.columns.to_frame().fillna(''))
接受的解决方案对我也不起作用。即使单独检查 df.index.levels
没有显示 NA 值,它仍然在索引中留下 NA 值。
Jorge 的 为我指明了正确的方向,但也不太适合我的情况。这是我的方法,包括处理已接受答案的评论中讨论的单个 Index
案例。
if isinstance(df.index, pd.MultiIndex):
df.index = pd.MultiIndex.from_frame(
df.index.to_frame().fillna(my_fillna_value)
)
else:
df.index = df.index.fillna(my_fillna_value)
在使用 MultiIndex 读取 excel sheet 后,我得到 np.nan 出现在索引中,因为一些值是 'N/A' 和 pd.read_excel 认为转换它们是个好主意。但是我想将它们保留为 'N/A' 以保留多索引。我认为使用 MultiIndex.fillna 很容易将它们改回原来的状态,但我收到此错误:
index = pd.MultiIndex(levels=[[u'foo', u'bar'], [u'one', np.nan]],
codes=[[0, 0, 1, 1], [0, 1, 0, 1]],
names=[u'first', u'second'])
df = pd.DataFrame(index=index, columns=['A', 'B'])
df
df.index.fillna("N/A")
输出:
---------------------------------------------------------------------------
NotImplementedError Traceback (most recent call last)
<ipython-input-17-09e14dcdc74f> in <module>
----> 1 df.index.fillna("N/A")
/anaconda3/envs/torch/lib/python3.7/site-packages/pandas/core/indexes/multi.py in fillna(self, value, downcast)
1456 fillna is not implemented for MultiIndex
1457 """
-> 1458 raise NotImplementedError("isna is not defined for MultiIndex")
1459
1460 @Appender(_index_shared_docs["dropna"])
NotImplementedError: isna is not defined for MultiIndex
更新:
代码已更新以反映 Pandas 1.0.2。在版本 0.24.0 之前,pd.MultiIndex
的 codes
属性被称为 labels
。此外,回溯详细信息从 isnull is not defined
更改为 isna is not defined
如上所述。
使用set_levels
df.index.set_levels([l.fillna('N/A') for l in df.index.levels], inplace=True)
df
当前的解决方案在具有多级列时对我不起作用。我所做的和为我工作的是以下内容:
df.columns = pd.MultiIndex.from_frame(df.columns.to_frame().fillna(''))
接受的解决方案对我也不起作用。即使单独检查 df.index.levels
没有显示 NA 值,它仍然在索引中留下 NA 值。
Jorge 的 Index
案例。
if isinstance(df.index, pd.MultiIndex):
df.index = pd.MultiIndex.from_frame(
df.index.to_frame().fillna(my_fillna_value)
)
else:
df.index = df.index.fillna(my_fillna_value)