我将需要以下列: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函数,但与想要的结果相去甚远。
答案 0 :(得分:2)
将indexing by str
与add
一起使用:
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