如何根据条件在数据框中创建新列

时间:2020-05-19 19:09:33

标签: python pandas conditional-statements

我正在尝试通过以下条件在数据框中创建新列:

  1. 如果Date_of_basket_entry中的值为NAN,则响应为0。
  2. 如果Date_of_basket_entry中的值较大(日期仍在 未来),然后在month_year中回答1。
  3. 如果Date_of_basket_entry中的值较小(日期仍在 PAST),然后在month_year中返回0。

    month_year  Date_of_basket_entry
    0   03/2017 01.04.2005
    1   02/2019 01.01.1995
    2   07/2017 None
    4   02/2017 None
    5   04/2017 01.01.2020
    

应该是这样的:

  month_year    Date_of_basket_entry  Date_of_basket_boolean
    0   03/2017     01.04.2005                0
    1   02/2019     01.01.1995                0 
    2   07/2017     None                      0
    4   02/2017     None                      0
    5   04/2017     01.01.2020                1

2 个答案:

答案 0 :(得分:0)

@Danielhab在这种情况下,我喜欢np.where。

import numpy as np

# if dtype is wrong the condition won't work correctly
df = df.astype(np.datetime64)
df.loc[:, 'Date_of_basket_boolean'] = np.where((df.Date_of_basket_entry.isna()) | (df.Date_of_basket_entry < df.month_year), 0, 1)

我认为这应该有效,只需检查一下您的逻辑即可。

答案 1 :(得分:0)

我认为将月份/年份与month.day.year进行比较可能比较困难。我将从将列转换为具有相同结构开始。然后,您可以使用numpy的np.where函数。

import pandas as pd
import numpy as np

df = pd.DataFrame({'month_year':['03/2017','02/2019', '07/2017', '02/2017', '04/2017'],
               'Date_of_basket_entry':['1.04.2005','01.01.1995', None, None, '01.01.2020']})

df['new1'] = pd.to_datetime(df['month_year'], infer_datetime_format=True)
df['new2'] = pd.to_datetime(df['Date_of_basket_entry'], infer_datetime_format=True)
print(df)

  month_year Date_of_basket_entry       new1       new2
0    03/2017            1.04.2005 2017-03-01 2005-01-04
1    02/2019           01.01.1995 2019-02-01 1995-01-01
2    07/2017                 None 2017-07-01        NaT
3    02/2017                 None 2017-02-01        NaT
4    04/2017           01.01.2020 2017-04-01 2020-01-01

df['Date_of_basket_boolean'] = np.where(df['new2']>df['new1'],1,0)
print(df)

  month_year Date_of_basket_entry       new1       new2  Date_of_basket_boolean
0    03/2017            1.04.2005 2017-03-01 2005-01-04                       0
1    02/2019           01.01.1995 2019-02-01 1995-01-01                       0
2    07/2017                 None 2017-07-01        NaT                       0
3    02/2017                 None 2017-02-01        NaT                       0
4    04/2017           01.01.2020 2017-04-01 2020-01-01                       1