将数字从其他列按位置转移到Python中的新列?

时间:2018-07-03 09:29:14

标签: python pandas

我将需要以下列:CAD_ADMIN,rank

CAD_ADMIN rank
0507502   001
0507503   002
0507504   003
0507505   004

我这样制作了rank列:

dff['rank']= (dff.groupby('CAD_ADMIN').cumcount()+1).astype(str).str.zfill(3)

这是我需要做的 新列将具有:

CAD_ADMIN开始的前5个数字,然后是字母'qw',然后是CAD_ADMIN的其余部分(位置分别为6和7个数字,然后是rank列 例如:

new_col
05075qw02001   #first line
etc..

我尝试了一些lambda函数,但与想要的结果相去甚远。

1 个答案:

答案 0 :(得分:2)

indexing by stradd一起使用:

dff['new'] = dff['CAD_ADMIN'].str[:5].add('qv').add(dff['CAD_ADMIN'].str[5:]).add(dff['rank'])
print (df)
  CAD_ADMIN rank           new
0   0507502  001  05075qv02001
1   0507503  002  05075qv03002
2   0507504  003  05075qv04003
3   0507505  004  05075qv05004

如果输出df中不需要等级列:

rank = (dff.groupby('CAD_ADMIN').cumcount()+1).astype(str).str.zfill(3)
dff['new'] = dff['CAD_ADMIN'].str[:5].add('qv').add(dff['CAD_ADMIN'].str[5:]).add(rank)
print (dff)
  CAD_ADMIN           new
0   0507502  05075qv02001
1   0507503  05075qv03001
2   0507504  05075qv04001
3   0507505  05075qv05001

使用format和列表理解的解决方案: :

rank = (dff.groupby('CAD_ADMIN').cumcount()+1).astype(str).str.zfill(3)
dff['new'] = ['{}qv{}'.format(x[:5], x[5:]) for x in dff['CAD_ADMIN']] + rank
#python 3.6 solution
#dff['new'] = [f'{x[:5]}qv{x[5:]}' for x in dff['CAD_ADMIN']] + rank
print (dff)
  CAD_ADMIN           new
0   0507502  05075qv02001
1   0507503  05075qv03001
2   0507504  05075qv04001
3   0507505  05075qv05001

在输出rank中是否需要列DataFrame的解决方案:

dff['rank'] = (dff.groupby('CAD_ADMIN').cumcount()+1).astype(str).str.zfill(3)
dff['new'] = ['{}qv{}'.format(x[:5], x[5:]) for x in dff['CAD_ADMIN']] + dff['rank']
print (dff)
  CAD_ADMIN rank           new
0   0507502  001  05075qv02001
1   0507503  001  05075qv03001
2   0507504  001  05075qv04001
3   0507505  001  05075qv05001