代码之家  ›  专栏  ›  技术社区  ›  daiyue

在每个组的另一列上基于多个条件创建布尔列

  •  0
  • daiyue  · 技术社区  · 6 年前

    我有以下几点 df

    cluster_id   inv_id    
    1            A1
    1            A1
    2            A1111A
    2            A1111A
    

    我想 groupby cluster_id 并创建一个名为 invalid_inv_id inv_id

    1. in each cluster, if the length of inv_id (stripped of non numerics) < 100 set "invalid_inv_id" to true;
    

    2. in each cluster, if the length of inv_id is < 3 set "invalid_inv_id" to true.
    

    df['inv_id_stp'] = df.inv_id.str.replace(r'\D+', '')
    
    grouped = df.groupby('cluster_id')
    
    invoices['invalid_inv_id'] = grouped['inv_id_stp'].transform(lambda x: x.str.len()) < 100
    
    invoices['invalid_inv_id'] = grouped['inv_id'].transform(lambda x: x.str.len()) < 3
    

    cluster_id    inv_id    invalid_inv_id
    1             A1         True
    1             A1         True
    2             A1111A     True
    2             A1111A     True
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   BENY    6 年前

    IIUC公司, groupby 这里不需要

    (df.inv_id.str.len()<3)|(df.inv_id.str.replace(r'\D+', '').str.len()<100)
    Out[472]: 
    0    True
    1    True
    2    True
    3    True
    Name: inv_id, dtype: bool
    

    any

    ((df.inv_id.str.len()<3)|(df.inv_id.str.replace(r'\D+', '').str.len()<100)).groupby(df['cluster_id']).transform('any')