【问题标题】:Generating a custom ID based on other columns in python根据python中的其他列生成自定义ID
【发布时间】:2018-11-27 19:31:49
【问题描述】:

我有一个看起来像这样的 pandas df

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

如果有人能帮我解决这个问题,我将不胜感激。 提前致谢!!

【问题讨论】:

    标签: python string pandas dataframe


    【解决方案1】:

    这是使用 Pandas 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
    

    【讨论】:

    • 应该更快,因为它是矢量化的?
    • @MisterMonk,不,Pandas str 方法未矢量化。仅使用内置 str 方法 + f-strings 的列表理解可能更快。
    • 很高兴知道
    【解决方案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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-24
        • 2021-08-27
        • 1970-01-01
        相关资源
        最近更新 更多