M. Sameer Beig
M. Sameer Beig

Reputation: 53

Replace values in Columns

I want to replace values in columns using if loop:

If value in column [D] is not same as any values in [A,B,C] then replace column with first NaN with D, and if there is no NaN in a row, create a new column [E] and add value from column [D] in column [E].

ID    A    B    C    D 

0    22   32   NaN   22
1    25   13   NaN   15
2    27   NaN  NaN   20
3    29   10   16    29
4    12   92   33    55

I want output to be:

ID    A     B    C     D    E

 0    22   32   NaN   22
 1    25   13   15    15
 2    27   20   NaN   20
 3    29   10   16    29
 4    12   92   33    55   55

Upvotes: 0

Views: 202

Answers (2)

moys
moys

Reputation: 8033

You can do it this way

a = df.isnull()  
b = (a[a.any(axis=1)].idxmax(axis=1)) 
nanindex = b.index

check = (df.A!=df.D) & (df.B!=df.D) & (df.C!=df.D)
commonind = check[~check].index

replace_ind_list = list(nanindex.difference(commonind))
new_col_list = df.index.difference(list(set(commonind.tolist()+nanindex.tolist()))).tolist()

df['E']=''
for index, row in df.iterrows():
    for val in new_col_list:
        if index == val:
            df.at[index,'E'] = df['D'][index]
    for val in replace_ind_list:
        if index == val:
            df.at[index,b[val]] = df['D'][index]
df

Output

    ID  A   B        C       D  E
0   0   22  32.0    NaN     22  
1   1   25  13.0    15.0    15  
2   2   27  20.0    NaN     20  
3   3   29  10.0    16.0    29  
4   4   12  92.0    33.0    55  55

Upvotes: 1

Abdulwahabdev
Abdulwahabdev

Reputation: 66

List = [[22  , 32 ,  None ,  22],
        [25  , 13 ,  None ,  15],
        [27  , None ,  None ,  20],
        [29  , 10 ,  16 ,  29],
        [12  , 92 ,  33 ,  55]]

for Row in List:
    Target_C = Row[3]
    if Row.count(Target_C) < 2:                      # If there is no similar condetion pass 
        None_Found = False                           # Small bool to check later if there is no None !
        for enumerate_Column in enumerate(Row):      # get index for each list
            if(None in enumerate_Column):            # if  there is None gin the row
                Row[enumerate_Column[0]] = Target_C  # replace None with column D
                None_Found = True                    # Change None_Found to True
            if(None_Found):                          # Break the loop if found None
                break                                
        if(None_Found == False):                     # if you dont found None add new clulmn
            Row.append(Target_C)

My Code example

Upvotes: 1

Related Questions