Iterating through all values of df to replace zero values

Question:

I want to iterate through all values of a df so that if it detects some zero, I can replace that specific element with the mean of the adjacent columns.

I tried this code but I dont know why isnt working. Somebody can help me, please??

import pandas as pd
import numpy as np
import numpy as np

d = {'col1': [4, 1, 2], 'col2': [1, 0, 4], 'col3': [12, -2, 4]}
df = pd.DataFrame(data=d)


for i in range(len(df)):
        for j in list(df):
                if df.loc[i,j] is np.nan:
                        df.loc[i,j] = (df.loc[i,j-1] + df.loc[i, j+1])/2

So that 0 in the position 2×2 of the matrix would be replace with the mean between 1 and -2 (the elements at the same line and adjacent columns)

Asked By: Davi

||

Answers:

There’s a couple of small things, but I hope this helps.

import pandas as pd
import numpy as np
d = {'col1': [4, 1, 2], 'col2': [1, np.nan, 4], 'col3': [12, -2, 4]}
df = pd.DataFrame(data=d)

rows, cols = df.shape
for i in range(rows):
        for j in range(cols):
                if np.isnan(df.iloc[i,j]):
                        df.iloc[i,j] = (df.iloc[i,j-1] + df.iloc[i, j+1])/2
Answered By: bn_ln

You have to replace list(df) by range(len(df.columns))

and df.loc by df.iloc

for i in range(len(df)):
        for j in range(len(df.columns)):
                if pd.isnull(df.iloc[i,j]):
                        df.iloc[i,j] = (df.iloc[i-1,j] + df.iloc[i+1, j])/2
Answered By: Khaled DELLAL