检查列表中的相应列和最低d

2024-09-29 20:16:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,每行有多个状态字段。我想检查是否有任何状态字段在列表中有值,如果有,我需要取对应状态的最低日期字段。我的可接受值列表和示例数据框如下所示:

checkList = ['Foo','Bar']

df = pd.DataFrame([['A',np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],['B','Foo',datetime.datetime(2017,10,1),'Other',datetime.datetime(2017,9,1),np.nan,np.nan],
                  ['C','Bar',datetime.datetime(2016,1,1),np.nan,np.nan,'Foo',datetime.datetime(2016,5,5)]]
                ,columns = ['record','status1','status1_date','status2','status2_date','another_status','another_status_date'])

print df

 record status1 status1_date status2 status2_date another_status  \
0      A     NaN          NaT     NaN          NaT            NaN   
1      B     Foo   2017-10-01   Other   2017-09-01            NaN   
2      C     Bar   2016-01-01     NaN          NaT            Foo   

  another_status_date  
0                 NaT  
1                 NaT  
2          2016-05-05  

我需要弄清楚这些状态是否在批准名单中。如果是的话,我需要一个批准状态的第一个日期。输出如下所示:

print output_df

  record master_status master_status_date
0      A         False                NaT
1      B          True         2017-10-01
2      C          True         2016-01-01

关于如何最好地接近的想法?我不能只取min date,我需要min,在列表中对应的status字段


Tags: df列表datetimedatefoostatusnpanother
1条回答
网友
1楼 · 发布于 2024-09-29 20:16:03
master_status = df.apply(lambda x: False if all([pd.isnull(rec) for rec in x[1:]]) else True, axis=1)
master_status_date = df.apply(lambda x: min([i for i in x[1:] if isinstance(i, datetime.datetime)]), axis=1)
record = df['record']


n_df = pd.concat([record, master_status, master_status_date], 1)

print(n_df)
  record      0          1
0      A   False        NaT
1      B   True   2017-09-01
2      C   True   2016-01-01

相关问题 更多 >

    热门问题