mufassir
mufassir

Reputation: 562

df.fillna(dict) is not filling NaN values

I have following 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

I want to fill NaN values of this df with the value at index 12, i.e.

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

I tried the following code:

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

But, it is not filling any NaN values and df remains unchanged. When I put x=1, NaN values are filled with 1. Why is this happening? Any solution to this?

Upvotes: 1

Views: 126

Answers (2)

Andrej Kesely
Andrej Kesely

Reputation: 195543

You can use boolean indexing instead of .fillna:

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

Prints:

                                                  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': '...

Or (for one column):

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)

Upvotes: 1

BENY
BENY

Reputation: 323326

We can still try fillna but need to pass the index dict

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

Upvotes: 1

Related Questions