spitfiredd
spitfiredd

Reputation: 3125

How do I change the values in one column based on a different column?

How do you change the values on cola based on colb? For example, say I want to change the name where ID = 1,4,7?

ID Name
1  Name1
2  Name2
3  Name3
4  Name4
5  Name5
6  Name6
7  Name7
8  Name8

Preferably I want to use a dictionary, like so:

change = {
    1: 'foo',
    4: 'bar',
    7: 'baz'
}

And if I appy the change dictionary with a map like so:

df['Name'] = df['ID'].map(change) 

However, it just changes the ID for 1,4, and 7.

ID Name
    1  foo
    2  
    3  
    4  bar
    5  
    6  
    7  baz
    8  

Is there to only change the rows that are in my dictionary and ignore the rest? To get the result:

ID Name
1  foo
2  Name2
3  Name3
4  bar
5  Name5
6  Name6
7  baz
8  Name8

Upvotes: 2

Views: 57

Answers (2)

Divakar
Divakar

Reputation: 221514

Here's one with a masking method -

df.loc[df.ID.isin(change.keys()),'Name'] = change.values()

Sample run -

In [396]: df
Out[396]: 
   ID   Name
0   1  Name1
1   2  Name2
2   3  Name3
3   4  Name4
4   5  Name5
5   6  Name6
6   7  Name7
7   8  Name8

In [397]: df.loc[df.ID.isin(change.keys()),'Name'] = change.values()

In [398]: df
Out[398]: 
   ID   Name
0   1    foo
1   2  Name2
2   3  Name3
3   4    bar
4   5  Name5
5   6  Name6
6   7    baz
7   8  Name8

Upvotes: 1

jezrael
jezrael

Reputation: 862471

Add fillna or combine_first:

df['Name'] = df['ID'].map(change).fillna(df['Name'])
print (df)
   ID   Name
0   1    foo
1   2  Name2
2   3  Name3
3   4    bar
4   5  Name5
5   6  Name6
6   7    baz
7   8  Name8

Or:

df['Name'] = df['ID'].map(change).combine_first(df['Name'])
print (df)
   ID   Name
0   1    foo
1   2  Name2
2   3  Name3
3   4    bar
4   5  Name5
5   6  Name6
6   7    baz
7   8  Name8

Upvotes: 4

Related Questions