Python Pandas сравнивают столбцы даты, проверяют, не пусто ли, условные> <= логика, возвращаемое значение - PullRequest
0 голосов
/ 24 октября 2018

используя Python3 Pandas, я пытаюсь вычислить РЕЗУЛЬТАТ.Я продолжаю получать булево неоднозначное значение ошибки.Нужно ли проверять, что каждый столбец даты, с которым я сравниваю, не является пустым, чтобы избежать ошибки?Конечный результат должен имитировать:

#check if D3_UNTIL is not empty
if df.RUNNING_DATE.isna()==False:
    if df.D3_UNTIL.isna()==False:
        if.RUNNING_DATE >= df.D3_UNTIL:
            df.RESULT = df.DVAL3
        elif (df.RUNNING_DATE >= df.D2_UNTIL & df.RUNNING_DATE < df.D3_UNTIL):
            df.RESULT = df.DVAL2    
        elif (df.RUNNING_DATE >= df.D1_UNTIL & df.RUNNING_DATE < df.D2_UNTIL):
            df.RESULT = df.DVAL1
        else None
#check if D2.UNTIL is not empty
    elif df.D2_UNTIL.isna()==False:
        if.RUNNING_DATE >= df.D2_UNTIL:
            df.RESULT = df.DVAL2
        elif (df.RUNNING_DATE >= df.D1_UNTIL & df.RUNNING_DATE < df.D2_UNTIL):
            df.RESULT = df.DVAL1    
        else None
#check if D1.UNTIL is not empty    
    elif df.D1_UNTIL.isna()==False:
        if.RUNNING_DATE >= df.D1_UNTIL:
            df.RESULT = df.DVAL1
        else None
else None



RUNNING_DATE  D1_UNTIL  DVAL1  D2_UNTIL  DVAL2  D3_UNTIL  DVAL3  RESULT
1/1/2018      1/1/2018  10                                       10             
1/2/2018                                
1/3/2018      1/1/2018                          
1/4/2018      1/1/2018  10     1/3/2018  15             
1/5/2018      1/1/2018  10     1/3/2018  20     1/31/2018 100    20 
1/6/2018      1/1/2018  10               999                
1/7/2018      1/1/2018  10     1/4/2018  25     1/6/2018  300    300    

1 Ответ

0 голосов
/ 24 октября 2018

С операторами if-else вы можете использовать np.select для реализации своей логики.Также проверка df.RUNNING_DATE.isna()==False является излишней;просто используйте df.RUNNING_DATE.notnull().

Далее, логика здесь может быть упрощена очень .

  • Любое >=, == или <= сравнение дат с NaT вернет False, поэтому сначала проверяйте, является ли значение конечным, не нужным, когда уже проверяете, является ли RUNNING_DATEбольше.Также любое сравнение NaT с NaT возвращает False, что дает нам проверку по умолчанию, если RUNNING_DATE имеет значение null.
  • Поскольку проверки даты охватывают весь диапазон возможностей, просто последовательно проверяйте >=.

Код

import pandas as pd
import numpy a np

# Ensure Datetime
#df['RUNNING_DATE'] = pd.to_datetime(df.RUNNING_DATE, errors='coerce')
#df['D1_UNTIL'] = pd.to_datetime(df.D1_UNTIL, errors='coerce')
#df['D2_UNTIL'] = pd.to_datetime(df.D2_UNTIL, errors='coerce')
#df['D3_UNTIL'] = pd.to_datetime(df.D3_UNTIL, errors='coerce')

conds = [
    df.RUNNING_DATE >= df.D3_UNTIL,
    df.RUNNING_DATE >= df.D2_UNTIL,
    df.RUNNING_DATE >= df.D1_UNTIL]

choices = [
    df.DVAL3,
    df.DVAL2,
    df.DVAL1]

df['RESULT'] = np.select(conds, choices, default=None)

Вывод:

(я добавил дополнительные строки в конце, чтобы проиллюстрировать логику)

  RUNNING_DATE   D1_UNTIL  DVAL1   D2_UNTIL  DVAL2   D3_UNTIL  DVAL3 RESULT
0   2018-01-01 2018-01-01   10.0        NaT    NaN        NaT    NaN     10
1   2018-01-02        NaT    NaN        NaT    NaN        NaT    NaN   None
2   2018-01-03 2018-01-01    NaN        NaT    NaN        NaT    NaN    NaN
3   2018-01-04 2018-01-01   10.0 2018-01-03   15.0        NaT    NaN     15
4   2018-01-05 2018-01-01   10.0 2018-01-03   20.0 2018-01-31  100.0     20
5   2018-01-06 2018-01-01   10.0        NaT  999.0        NaT    NaN     10
6   2018-01-07 2018-01-01   10.0 2018-01-04   25.0 2018-01-06  300.0    300
7          NaT        NaT    NaN        NaT    NaN        NaT    NaN   None
8          NaT        NaT    NaN 2018-01-01   24.0        NaT    NaN   None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...