Python 如果要比较日期列,请检查是否为空,有条件><;=逻辑,返回值
使用Python3熊猫,我试图计算结果。我不断得到布尔值不明确的错误。我是否需要首先测试我比较的每个日期列都不是空的,以避免出现错误?最终结果应该是:Python 如果要比较日期列,请检查是否为空,有条件><;=逻辑,返回值,python,pandas,Python,Pandas,使用Python3熊猫,我试图计算结果。我不断得到布尔值不明确的错误。我是否需要首先测试我比较的每个日期列都不是空的,以避免出现错误?最终结果应该是: #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.DVAL
#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
#检查D3_UNTIL是否为空
如果df.RUNNING_DATE.isna()==False:
如果df.D3_UNTIL.isna()==False:
如果.RUNNING_DATE>=df.D3_直到:
df.RESULT=df.DVAL3
elif(df.RUNNING_DATE>=df.D2_UNTIL&df.RUNNING_DATE=df.D1_UNTIL&df.RUNNING_DATE=df.D2_,则直到:
df.RESULT=df.DVAL2
elif(df.RUNNING_DATE>=df.D1_UNTIL&df.RUNNING_DATE=df.D1_直到:
df.RESULT=df.DVAL1
没有别的
没有别的
运行日期D1直到DVAL1 D2直到DVAL2 D3直到DVAL3结果
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
对于if-else语句,您可以使用np。选择
来实现您的逻辑。另外,检查df.RUNNING_DATE.isna()==False也是多余的;只需使用df.RUNNING\u DATE.notnull()
此外,这里的逻辑可以大大简化
- 任何
=
、=
或=
顺序
代码
输出:
(我在末尾添加了额外的行以说明逻辑)
对于if-else语句,您可以使用np。选择来实现您的逻辑。另外,检查df.RUNNING_DATE.isna()==False也是多余的;只需使用df.RUNNING\u DATE.notnull()
此外,这里的逻辑可以大大简化
- 任何
=
、=
或=
顺序
代码
输出:
(我在末尾添加了额外的行以说明逻辑)
您能否运行print(df.head(5).to_dict())
并将输出粘贴到问题中的某个位置,以便轻松复制数据?模糊错误的本质是这样的。你有一系列的数据,有些是真的,有些是假的。如果s==True,您应该返回什么?有些数据是真的,有些数据是假的。解决这个问题的一种方法是(s==True).any()或(s==True).all(),因此您可以清楚地定义,如果任何值为True,则返回True;如果s中的所有值都为True,则返回True。因此,示例代码df.RUNNING_DATE.isna()==False中的第2行,那么,如果df.RUNNING_DATE中的一些值为null,而另一些值则不为,那么if语句是不明确的。您的结果与您的逻辑不一致。第一行应该分配给DVAL1
,2018年6月1日1的行也应该分配给DVAL1
@ALollz是的,好捕获。我正在输入,但忘了包含它。你能运行print(df.head(5).to_dict())
并将输出粘贴到问题的某个地方,以便轻松复制数据吗?模糊错误的本质是这样的。你有一系列的数据,有些是真的,有些是假的。如果s==True,您应该返回什么?有些数据是真的,有些数据是假的。解决这个问题的一种方法是(s==True).any()或(s==True).all(),因此您可以清楚地定义,如果任何值为True,则返回True;如果s中的所有值都为True,则返回True。因此,示例代码df.RUNNING_DATE.isna()==False中的第2行,那么,如果df.RUNNING_DATE中的一些值为null,而另一些值则不为,那么if语句是不明确的。您的结果与您的逻辑不一致。第一行应该分配给DVAL1
,2018年6月1日1的行也应该分配给DVAL1
@ALollz是的,好捕获。我正在键入它,但忘了包含它。为了我的充分理解,在conds list变量和choices list变量中,np.select是否会对列表中的元素位置进行求值(即,如果cond[0],那么choices[0],elif cond[1],那么choices[1],....@Chris,是的,完全正确。从文档中可以看出,当满足多个条件时,将使用condlist中遇到的第一个条件,这就是为什么我们能够安全地检查条件是否大于该特定顺序。如果没有一个条件得到满足(当RUNNING_DATE
为空,或者当RUNNING DATE小于所有其他字段时,它将使用默认值,我们将其设置为None
。非常感谢!这是一个很大的帮助,比我的方法优雅得多。@Chris很高兴它起到了帮助作用!你采取了一种更具代表性的逐行方法使用pandas,您可以将这些计算作为作用于整组列的计算,这就是np。select
的作用。为了我的充分理解,在conds list变量和choices list变量中,np.select是否对列表中的每个元素位置进行评估(即,如果cond[0],则choices[0],elif cond[1]然后选择[1],..@Chris,是的,完全正确。从文档中,当满足多个条件时,使用condlist中遇到的第一个条件,这就是为什么我们可以安全地检查条件是否大于该特定顺序。如果不满足任何条件(当RUNNING\u DATE
为空时,或当RUNNING DATE为空时,即为这种情况。)
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