Reputation: 2443
I would like to relocate columns by condition. In case country is 'Japan', I need to relocate last_name and first_name reverse.
df = pd.DataFrame([['France','Kylian', 'Mbappe'],
['Japan','Hiroyuki', 'Tajima'],
['Japan','Shiji', 'Kagawa'],
['England','Harry', 'Kane'],
['Japan','Yuya', 'Ohsako'],
['Portuguese','Cristiano', 'Ronaldo']],
columns=['country', 'first_name', 'last_name'])
Current output is
country first_name last_name
0 France Kylian Mbappe
1 Japan Hiroyuki Tajima
2 Japan Shiji kagawa
3 England Harry Kane
4 Japan Yuya Ohsako
5 Portuguese Cristiano Ronaldo
I would like to make it following.
country first_name last_name
0 France Kylian Mbappe
1 Japan Tajima Hiroyuki
2 Japan Kagawa Shinji
3 England Harry Kane
4 Japan Ohsako Yuya
5 Portuguese Cristiano Ronaldo
Any idea?
Upvotes: 6
Views: 8127
Reputation: 521
### check below
df['first_name'],df['last_name']=np.where(df['country']=='Japan',(df['last_name'],df['first_name']),(df['first_name'],df['last_name']))
country first_name last_name
0 France Kylian Mbappe
1 Japan Tajima Hiroyuki
2 Japan Kagawa Shiji
3 England Harry Kane
4 Japan Ohsako Yuya
5 Portuguese Cristiano Ronaldo
Upvotes: 8
Reputation: 403268
Use loc
and swap the "first_name" and "last_name" values for rows whose "country" matches "Japan".
m = df['country'] == 'Japan'
df.loc[m, ['first_name', 'last_name']] = (
df.loc[m, ['last_name', 'first_name']].values)
df
country first_name last_name
0 France Kylian Mbappe
1 Japan Tajima Hiroyuki
2 Japan Kagawa Shiji
3 England Harry Kane
4 Japan Ohsako Yuya
5 Portuguese Cristiano Ronaldo
Another option using rename
and update
:
mp = {'first_name': 'last_name', 'last_name': 'first_name'}
df.update(df.loc[m].rename(mp, axis=1))
df
country first_name last_name
0 France Kylian Mbappe
1 Japan Tajima Hiroyuki
2 Japan Kagawa Shiji
3 England Harry Kane
4 Japan Ohsako Yuya
5 Portuguese Cristiano Ronaldo
Upvotes: 11
Reputation: 2189
try this:
df['last_name1']=df.last_name
df.loc[df.country=='Japan','last_name']=df[df.country=='Japan']['first_name']
df.loc[df.country=='Japan','first_name']=df[df.country=='Japan']['last_name1']
df=df.drop(['last_name1'],axis=1)
Upvotes: 0
Reputation: 13426
Using np.where
mask = df['country']=='Japan'
df['first_name1'] = np.where(mask, df['last_name'], df['first_name'])
df['last_name'] = np.where(mask, df['first_name'], df['last_name'])
df['first_name'] = df['first_name1']
df.drop('first_name1', axis=1, inplace=True)
Output:
country first_name last_name
0 France Kylian Mbappe
1 Japan Tajima Hiroyuki
2 Japan Kagawa Shiji
3 England Harry Kane
4 Japan Ohsako Yuya
5 Portuguese Cristiano Ronaldo
Upvotes: 1