基于python中的其他列生成自定义ID

基于python中的其他列生成自定义ID,python,string,pandas,dataframe,Python,String,Pandas,Dataframe,我有一只熊猫,看起来像这样 UID DOB BEDNUM 0 1900-01-01 CICU1 1 1927-05-21 CICU1 2 1929-10-03 CICU1 3 1933-06-29 CICU1 4 1936-01-09 CICU1 5 1947-11-14 CICU1 6 1900-01-01 CIC

我有一只熊猫,看起来像这样

   UID    DOB        BEDNUM     
    0   1900-01-01    CICU1   
    1   1927-05-21    CICU1 
    2   1929-10-03    CICU1 
    3   1933-06-29    CICU1 
    4   1936-01-09    CICU1 
    5   1947-11-14    CICU1   
    6   1900-01-01    CICU1   
    7   1927-05-21    CICU1 
    8   1929-10-03    CICU1 
    9   1933-06-29    CICU1 
   10   1936-01-09    CICU1 
   11   1947-11-14    CICU1   
现在,我想向该数据帧添加一个新的列TID,该列应为'YYYY-0000000-p'格式

    UID    DOB        BEDNUM    TID 
    0   1900-01-01    CICU1   1900-0000000-P
    1   1927-05-21    CICU1   1927-0000001-P
    2   1929-10-03    CICU1   1929-0000002-P
    3   1933-06-29    CICU1   1933-0000003-P
    4   1936-01-09    CICU1   1936-0000004-P
    5   1947-11-14    CICU1   1947-0000005-P
    6   1900-01-01    CICU1   1900-0000006-P
    7   1927-05-21    CICU1   1927-0000007-P
    8   1929-10-03    CICU1   1929-0000008-P
    9   1933-06-29    CICU1   1933-0000009-P
   10   1936-01-09    CICU1   1936-0000010-P
   11   1947-11-14    CICU1   1947-0000011-P
我在一个表中有24000条记录,最后一条记录TID应该看起来像“YYYY-0024000-p”

如果有人能帮我,我将不胜感激。 提前谢谢

此答案假设DOB是日期时间:


这里有一种使用方法的方法:

使用.str访问器的另一种方法:

year = df.DOB.str.split('-').str[0]
padded_uid = df.UID.astype(str).str.pad(7, 'left', '0')
df['TID'] = year + '-' + padded_uid + '-P'

应该更快,因为它是矢量化的?@MisterMonk,不,str方法不是矢量化的。只使用内置str方法+f字符串的列表理解可能更快。很高兴知道
    UID        DOB BEDNUM             TID
0     0 1900-01-01  CICU1  1900-0000000-P
1     1 1927-05-21  CICU1  1927-0000001-P
2     2 1929-10-03  CICU1  1929-0000002-P
3     3 1933-06-29  CICU1  1933-0000003-P
4     4 1936-01-09  CICU1  1936-0000004-P
5     5 1947-11-14  CICU1  1947-0000005-P
6     6 1900-01-01  CICU1  1900-0000006-P
7     7 1927-05-21  CICU1  1927-0000007-P
8     8 1929-10-03  CICU1  1929-0000008-P
9     9 1933-06-29  CICU1  1933-0000009-P
10   10 1936-01-09  CICU1  1936-0000010-P
11   11 1947-11-14  CICU1  1947-0000011-P
df['DOB'] = pd.to_datetime(df['DOB'])  # convert DOB to datetime if necessary

df['TID'] = df['DOB'].dt.year.astype(str) + '-' + df['UID'].astype(str).str.zfill(7) + '-P'

print(df)

    UID        DOB BEDNUM  Year             TID
0     0 1900-01-01  CICU1  1900  1900-0000000-P
1     1 1927-05-21  CICU1  1927  1927-0000001-P
2     2 1929-10-03  CICU1  1929  1929-0000002-P
3     3 1933-06-29  CICU1  1933  1933-0000003-P
4     4 1936-01-09  CICU1  1936  1936-0000004-P
5     5 1947-11-14  CICU1  1947  1947-0000005-P
6     6 1900-01-01  CICU1  1900  1900-0000006-P
7     7 1927-05-21  CICU1  1927  1927-0000007-P
8     8 1929-10-03  CICU1  1929  1929-0000008-P
9     9 1933-06-29  CICU1  1933  1933-0000009-P
10   10 1936-01-09  CICU1  1936  1936-0000010-P
11   11 1947-11-14  CICU1  1947  1947-0000011-P
year = df.DOB.str.split('-').str[0]
padded_uid = df.UID.astype(str).str.pad(7, 'left', '0')
df['TID'] = year + '-' + padded_uid + '-P'