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