Reputation: 562
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
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
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