Python 根据表中的条件交换列值
我想根据条件重新定位列。 如果国家是“日本”,我需要将姓氏和名字倒转Python 根据表中的条件交换列值,python,pandas,dataframe,Python,Pandas,Dataframe,我想根据条件重新定位列。 如果国家是“日本”,我需要将姓氏和名字倒转 df = pd.DataFrame([['France','Kylian', 'Mbappe'], ['Japan','Hiroyuki', 'Tajima'], ['Japan','Shiji', 'Kagawa'], ['England','Harry', 'Kane'], ['Japan','Yuya'
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'])
电流输出为
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
我想让它如下
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
有什么想法吗?使用
loc
并将“first\u name”和“last\u name”值交换给“country”与“Japan”匹配的行
使用
重命名
和更新
的另一个选项:
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
使用
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)
输出:
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
试试这个:
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)
输出:
您可以将列重命名,而不是
df['first\u name']=df['first\u name1']
。您还应该考虑仅用一次计算“国家”的条件,并将其保存到某种用途。但是<代码> FrestyNAME1列将仍然存在,我是正确的吗?<代码> DF.ReNeMe({‘FrestTyNAME1’:‘FixTyNeNe}’,轴=1)< /C> >将重命名该列(不重复它)。这比创建一个新的并删除旧的要好。@cs95那么我的df将有两列,名为first\u name
。我明白你的意思。一个建议是df['last_name']=np.where(mask,df.pop('first_name')),df.pop('last_name'))
,然后重命名就可以了。但在这一点上,发生的事情太多了。也许这样就好了。
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)
### 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