我有以下数据框。
df = pd.DataFrame({'A':['abc1@abc.com','abc2@abc.com','abc3@abc.com','abc4@abc.com','abc2@abc.com','abc3@abc.com'],
'B':[4,5,4,5,5,4],
})
我需要以
格式为A列生成rollnumber“字符串+!-10位数字从1开始盯着+字符串”
如果重复输入值,则卷号应该唯一。
预期输出:
A B RollNumber
0 abc1@abc.com 4 ABC000000001AB
1 abc2@abc.com 5 ABC000000002AB
2 abc3@abc.com 4 ABC000000003AB
3 abc4@abc.com 5 ABC000000004AB
4 abc2@abc.com 5 ABC000000002AB
5 abc3@abc.com 4 ABC000000003AB
答案 0 :(得分:2)
对zero fill使用列表理解:
#python 3.6+
df['RollNumber'] = [f'ABC{x:010}AB' for x in range(1, len(df) + 1)]
#python 3
#df['RollNumber'] = ['ABC{0:010d}AB'.format(x) for x in range(1, len(df) + 1)]
print (df)
A B RollNumber
0 abc1@abc.com 4 ABC0000000001AB
1 abc2@abc.com 5 ABC0000000002AB
2 abc3@abc.com 4 ABC0000000003AB
3 abc4@abc.com 5 ABC0000000004AB
4 abc2@bc.com 5 ABC0000000005AB
5 abc3@bc.com 4 ABC0000000006AB
编辑:对于每列相同的值,A
需要factorize
和Series.str.zfill
:
s = pd.Series(pd.factorize(df['A'])[0] + 1).astype(str).str.zfill(10)
df['RollNumber'] = ('ABC' + s + 'AB')
print (df)
A B RollNumber
0 abc1@abc.com 4 ABC0000000001AB
1 abc2@abc.com 5 ABC0000000002AB
2 abc3@abc.com 4 ABC0000000003AB
3 abc4@abc.com 5 ABC0000000004AB
4 abc2@abc.com 5 ABC0000000002AB
5 abc3@abc.com 4 ABC0000000003AB