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

了解如何基于df中的其他布尔列创建布尔列

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

    我有以下几点 df ,

    inv_date        inv_id
    2017-10-01      100117
    2018-04-02      040218
    2018-05-06      060518
    

    哪里 inv_date datetime dtype ,和 inv_id str 发票id 进入之内 日期时间 ,基于以下 formats

    formats = {'%m%d%y': 6, '%d%m%y': 6}
    L = [pd.to_datetime(s.str[:v], format=k, errors='coerce') for k, v in formats.items()]
    df1 = pd.concat(L, axis=1, keys=[s.name + '_' + str(i) for i, s in zip(count(), L)])
    df1 = df.apply(lambda x: x.where(x.between('2000-01-01', datetime.now())))
    

    我想创建一个布尔列 dummy_inv_id ,设置为 True 如果任何非NaT转换 日期时间 在+/-180天内

    df1 = df1.assign(inv_date=df['inv_date'])
    df1['inv_id_1'].between(df1['inv_date'] - Timedelta(180, unit='d'), df1['inv_date'] + Timedelta(180, unit='d'))
    df1['inv_id_2'].between(df1['inv_date'] - Timedelta(180, unit='d'), df1['inv_date'] + Timedelta(180, unit='d'))
    

    inv_id_1 inv_id_2 df1 如果有人介于 inv_date +/- 180 days true 测向

    测向 看起来像,

    inv_date        inv_id    dummy_inv_id
    2017-10-01      100117    true
    2018-04-02      040218    true
    2018-05-06      060518    true
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    你可以用 np.logical_or.reduce

    a = df1['inv_id_1'].between(df1['inv_date'] - pd.Timedelta(180, unit='d'), df1['inv_date'] + pd.Timedelta(180, unit='d'))
    b = df1['inv_id_2'].between(df1['inv_date'] - pd.Timedelta(180, unit='d'), df1['inv_date'] + pd.Timedelta(180, unit='d'))
    
    c = [a,b]
    df['dummy_inv_id'] = np.logical_or.reduce(c)
    print (df)
        inv_date  inv_id  dummy_inv_id
    0 2017-10-01  100117          True
    1 2018-04-02   40218          True
    2 2018-05-06   60518          True