df.fillna(dict) 未填充 NaN 值

df.fillna(dict) is not filling NaN values

我有以下 df:

0                                                                            NaN
1                                                                            NaN
2                                                                            NaN
3                                                                            NaN
4                                                                            NaN
5                                                                            NaN
6                                                                            NaN
7                                                                            NaN
8                                                                            NaN
9                                                                            NaN
10                                                                           NaN
11                                                                           NaN
12    {'A': {'B': '14:00', 'C': '12:30', 'D': '07:30'}}
13                                                                           NaN
14                                                                           NaN
15    {'A': {'B': '14:00', 'C': '12:30', 'D': '08:00'}}
16                                                                           NaN
17    {'A': {'B': '14:00', 'C': '13:30', 'D': '08:00'}}
18    {'A': {'B': '08:00', 'C': '08:00', 'D': '08:00'}}
19                                                                           NaN

我想用索引 12 处的值填充此 df 的 NaN 值,即

{'A': {'B': '14:00', 'C': '12:30', 'D': '07:30'}}

我尝试了以下代码:

x = {'A': {'B': '14:00', 'C': '12:30', 'D': '07:30'}}
df.fillna(x, inplace= True)

但是,它没有填充任何 NaN 值并且 df 保持不变。当我输入 x=1 时,NaN 值被 1 填充。为什么会这样?有什么解决办法吗?

您可以使用布尔索引代替 .fillna:

x = {"BLOCK_TIME": {"SPLIT": "14:00", "EVENING": "12:30", "MORNING": "07:30"}}
df[df.isna()] = x
print(df)

打印:

                                                  val
0   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
1   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
2   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
3   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
4   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
5   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
6   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
7   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
8   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
9   {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
10  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
11  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
12  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
13  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
14  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
15  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
16  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
17  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...
18  {'BLOCK_TIME': {'SPLIT': '08:00', 'EVENING': '...
19  {'BLOCK_TIME': {'SPLIT': '14:00', 'EVENING': '...

或(对于一列):

x = {"BLOCK_TIME": {"SPLIT": "14:00", "EVENING": "12:30", "MORNING": "07:30"}}
df.loc[df["val"].isna(), "val"] = df.loc[df["val"].isna(), "val"].apply(
    lambda _: x
)
print(df)

我们仍然可以尝试 fillna 但需要传递索引 dict

df = df.fillna({12:{'A': {'B': '14:00', 'C': '12:30', 'D': '07:30'}}})