代码之家  ›  专栏  ›  技术社区  ›  Bartek Malysz

如果满足某个条件,则熊猫应用值

  •  1
  • Bartek Malysz  · 技术社区  · 6 年前

    我有一个示例数据框,如下所示:

    {'Plan Date': {23186: nan,
      18533: nan,
      17980: nan,
      28559: nan,
      22587: 1572480000000000000,
      22522: 1580428800000000000,
      16639: 1572480000000000000,
      14304: 1572480000000000000},
     'Support Date': {23186: Timestamp('2020-12-31 00:00:00'),
      18533: Timestamp('2022-03-31 00:00:00'),
      17980: Timestamp('2022-03-31 00:00:00'),
      28559: Timestamp('2019-02-28 00:00:00'),
      22587: Timestamp('2019-07-31 00:00:00'),
      22522: Timestamp('2019-07-31 00:00:00'),
      16639: Timestamp('2019-10-31 00:00:00'),
      14304: Timestamp('2019-10-31 00:00:00')},
     'Plan Deadline': {23186: NaT,
      18533: NaT,
      17980: NaT,
      28559: NaT,
      22587: Timestamp('2019-10-31 00:00:00'),
      22522: Timestamp('2020-01-31 00:00:00'),
      16639: Timestamp('2019-10-31 00:00:00'),
      14304: Timestamp('2019-10-31 00:00:00')}}
    

    我想用同一数据框中其他列中最多2个日期填充计划日期列,前提是填充了计划截止日期列。使用np.where()非常复杂,我希望能找到一种更优雅、更高效的方法。

    2 回复  |  直到 6 年前
        1
  •  1
  •   jezrael    6 年前

    你可以避免 apply 为了更好的表现和分配 max 每个条件的值:

    data['Plan Date'] = pd.to_datetime(data['Plan Date'])
    
    mask = data['Plan Deadline'].notnull()
    data.loc[mask, 'Plan Date'] = data.loc[mask, ['Support Date', 'Plan Deadline']].max(axis=1)
    print (data)
           Plan Date Support Date Plan Deadline
    14304 2019-10-31   2019-10-31    2019-10-31
    16639 2019-10-31   2019-10-31    2019-10-31
    17980        NaT   2022-03-31           NaT
    18533        NaT   2022-03-31           NaT
    22522 2020-01-31   2019-07-31    2020-01-31
    22587 2019-10-31   2019-07-31    2019-10-31
    23186        NaT   2020-12-31           NaT
    28559        NaT   2019-02-28           NaT
    
        2
  •  0
  •   Bartek Malysz    6 年前

    我(在朋友的帮助下)找到了一种方法,省去了np.where和复杂的条件:

    data['Plan Date'] = data[['Support Date', 'Plan Deadline']].apply(lambda x: pd.NaT if pd.isnull(x[1]) else max(x), axis=1)