Pandas填充多级索引的fillna(inplace)方法

4

我有一个带有多层索引的数据框。

       values                            observations
time       x1    x2    x3    x4   ...         x1    x2    x3    x4    ...

  t1     v1_1   nan  v3_1  v4_1   ...       o1_1   nan  o3_1  o4_1    ...
  t2     v1_2  v2_2   nan  v4_2   ...       o1_2  o2_2   nan  o4_2    ...

我正在尝试使用0填充观测帧中的缺失值。

df.loc[:,('observations')].fillna(value=0, inplace=True)

但这并不能填充df。当我对切片应用fillna时,它可以正常工作。
dfx = df.loc[:,('observations')].fillna(value=0)

dfx的空值已被替换为0,我可以替换原始部分。

df.observations = dfx

我不清楚为什么第一种方法行不通,这似乎很奇怪。请问有人能够在这里给我解释一下吗?


我认为问题在于 loc 没有原地工作。因此,如果使用 df1 = df.loc[:,('observations')]df1.fillna(value=0, inplace=True) 就可以解决问题。 - jezrael
1个回答

5

对我来说有效的方法是:

df['observations'] = df['observations'].fillna(0)
print (df)
   values                   observations                  
     time    x1    x2    x3           x4    x1    x2    x3
t1   v1_1   NaN  v3_1  v4_1         o1_1     0  o3_1  o4_1
t2   v1_2  v2_2   NaN  v4_2         o1_2  o2_2     0  o4_2

我认为问题在于loc无法就地工作。因此,您可以使用以下方法:

df1 = df.loc[:,('observations')] 
df1.fillna(value=0, inplace=True)

另一个解决方案是通过切片进行选择,但需要首先通过 sort_index 对列名进行排序:
df.sort_index(inplace=True, axis=1)
idx = pd.IndexSlice
df.loc[:, idx['observations',:]] = df.loc[:, idx['observations',:]].fillna(0)
print (df)
     observations                   values                  
time           x1    x2    x3    x4     x1    x2    x3    x4
t1           o1_1     0  o3_1  o4_1   v1_1   NaN  v3_1  v4_1
t2           o1_2  o2_2     0  o4_2   v1_2  v2_2   NaN  v4_2

谢谢。我编辑了你的答案并复制了你上面的评论,这样我就可以接受它了。 - chrise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接