Pandas检查列表中的相应列和最低日期

时间:2017-11-07 21:00:47

标签: python pandas

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

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

关于如何最好地接近的想法?我不能在最短的约会时间,我需要在列表中有相应状态字段的地方。

1 个答案:

答案 0 :(得分:0)

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