我有一个带有multiindex的数据框
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将其nans替换为0并且我可以替换原始部分
df.observations = dfx
我不清楚为什么第一种方法不起作用。看起来很奇怪。谁能在这里启发我?
答案 0 :(得分: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)
另一种解决方案是按slicing
选择,但需要先按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