根据python中的其他列生成自定义ID

时间:2018-11-27 19:31:49

标签: python string pandas dataframe

我有一个看起来像这样的熊猫dp

   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'。

如果有人可以帮助我,我将非常感谢。 在此先感谢!

3 个答案:

答案 0 :(得分:2)

此答案假设DOBdatetime

year = df.DOB.dt.year
nums = df.UID.astype(str).str.zfill(7)
df.assign(TID=[f'{y}-{num}-P' for y, num in zip(year, nums)])

    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

答案 1 :(得分:2)

这是使用熊猫str方法的一种方法:

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

答案 2 :(得分:0)

使用.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'