Nickel
Nickel

Reputation: 590

Replace column values according to corresponding values of other column in Pandas

I am trying to replace value of columns on basis of column. for example col1 has values in first 5 rows and col2 has values so update col1 values according to col2.

For next five rows there are no value in col1 but col2 have value just skip these rows dont need to update col1, and so on.

df9["col1"].replace(["s1"], "data_value", inplace=True)

i used this code line from Replacing few values in a pandas dataframe column with another value. It gives me output just replace value with data value , not replace with values inside data value column.

Dataframe

    col1    col2    col3    col4
0   s1        NaN    NaN     NaN
1   s1        NaN    NaN     NaN
2   s1        NaN    NaN     NaN
3   s1       NaN    NaN     NaN
4   s1       NaN    NaN     NaN
5   NaN       s2    NaN     NaN
6   NaN       s2     NaN     NaN
7   NaN       s2    NaN     NaN
8   NaN       s2    NaN     NaN
9   NaN       s2    NaN     NaN
10  NaN      NaN    ss1     NaN
11  NaN      NaN    ss1     NaN
12  NaN      NaN    ss1     NaN
13  NaN      NaN    ss1     NaN
14  NaN      NaN    ss1     NaN
15  NaN      NaN    NaN     ss333
16  NaN      NaN    NaN     ss333
17  NaN      NaN    NaN     ss333
18  NaN      NaN    NaN     ss333
19  NaN      NaN    NaN     ss333

Desired output:

    col1    col2    col3    col4
0   0        NaN    NaN     NaN
1   0        NaN    NaN     NaN
2   0        NaN    NaN     NaN
3   0        NaN    NaN     NaN
4   0        NaN    NaN     NaN
5   NaN       0     NaN     NaN
6   NaN       0     NaN     NaN
7   NaN       0     NaN     NaN
8   NaN       0     NaN     NaN
9   NaN       0     NaN     NaN
10  NaN      NaN    500     NaN
11  NaN      NaN    500     NaN
12  NaN      NaN    500     NaN
13  NaN      NaN    500     NaN
14  NaN      NaN    500     NaN
15  NaN      NaN    NaN     500
16  NaN      NaN    NaN     500
17  NaN      NaN    NaN     500
18  NaN      NaN    NaN     500
19  NaN      NaN    NaN     500

Upvotes: 1

Views: 980

Answers (2)

Mohit Motwani
Mohit Motwani

Reputation: 4792

Alternatively you can also use where

df = pd.DataFrame({'col1': ['s1']*5+[np.nan]*15,
                  'col2':[np.nan]*5+['s2']*5+[np.nan]*10,
                  'col3':[np.nan]*10+['ss1']*5+[np.nan]*5,
                  'col4':[np.nan]*15+['ss333']*5,
                  'data_value':[0]*10+[500]*10 })

df = df.where(df.isnull(), df.pop('data_value'), axis = 0)

    col1    col2    col3    col4
0   0        NaN    NaN     NaN
1   0        NaN    NaN     NaN
2   0        NaN    NaN     NaN
3   0        NaN    NaN     NaN
4   0        NaN    NaN     NaN
5   NaN       0     NaN     NaN
6   NaN       0     NaN     NaN
7   NaN       0     NaN     NaN
8   NaN       0     NaN     NaN
9   NaN       0     NaN     NaN
10  NaN      NaN    500     NaN
11  NaN      NaN    500     NaN
12  NaN      NaN    500     NaN
13  NaN      NaN    500     NaN
14  NaN      NaN    500     NaN
15  NaN      NaN    NaN     500
16  NaN      NaN    NaN     500
17  NaN      NaN    NaN     500
18  NaN      NaN    NaN     500
19  NaN      NaN    NaN     500

Upvotes: 0

jezrael
jezrael

Reputation: 862441

Use mask for replace all not missing values with pop for extract column Data:

df = pd.DataFrame({
         'A':[4,5] + [np.nan] * 4,
         'B':[np.nan,np.nan,9,4,np.nan,np.nan],
         'C':[np.nan] * 4 + [7,0],
         'Data':list('aaabbb')
})

print (df)
     A    B    C Data
0  4.0  NaN  NaN    a
1  5.0  NaN  NaN    a
2  NaN  9.0  NaN    a
3  NaN  4.0  NaN    b
4  NaN  NaN  7.0    b
5  NaN  NaN  0.0    b

df = df.mask(df.notnull(), df.pop('Data'), axis=0)
print (df)
     A    B    C
0    a  NaN  NaN
1    a  NaN  NaN
2  NaN    a  NaN
3  NaN    b  NaN
4  NaN  NaN    b
5  NaN  NaN    b

Upvotes: 2

Related Questions