Python 如何使用dataframe查询从递归调用中获取值

Python 如何使用dataframe查询从递归调用中获取值,python,pandas,Python,Pandas,我试图在两个表之间进行查找。使用递归调用。但它总是一无所获。原因可能是什么 def checkExchangerate(yearEc,monthEc,dayEc,currCode): currCodes = { 'gbp' : 'GBP/EUR', 'usd' : 'USD/EUR' } retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)] print(retVal

我试图在两个表之间进行查找。使用递归调用。但它总是一无所获。原因可能是什么

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
currCodes = {
    'gbp' : 'GBP/EUR',
    'usd' : 'USD/EUR'
}
retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)]
print(retVal)
if retVal.empty:
    dayEc = dayEc-1
    checkExchangerate(yearEc,monthEc,dayEc,currCode)
else:
    return min(retVal)
支票兑换率(1999,1,17,'usd') 返回无

table exch_rate is pd.DataFrame: 
DAGS         USD/EUR   GRP/EUR 
1999-1-15      0,66    0,4 
1999-1-18      0,65    0,4

预期输出为0,66

请在问题中添加一些示例数据

在代码中:

    if retVal.empty:
        dayEc = dayEc-1
        checkExchangerate(yearEc,monthEc,dayEc,currCode)
    else:
        return min(retVal)
如果retVal为空,它将递归地调用自身。但当它从递归中出来时,它对返回值不做任何处理,因此它不返回任何值

table exch_rate is pd.DataFrame: 
DAGS         USD/EUR   GRP/EUR 
1999-1-15      0,66    0,4 
1999-1-18      0,65    0,4
要解决此问题,您应该
返回从递归返回的值:

    if retVal.empty:
        dayEc = dayEc-1
        return checkExchangerate(yearEc,monthEc,dayEc,currCode)
    else:
        return min(retVal)
此外,您还可以替换:

        dayEc = dayEc-1
        return checkExchangerate(yearEc,monthEc,dayEc,currCode)

但是,我建议使用循环代替递归:

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
    currCodes = {...}
    retVal = False
    while not retVal or retVal.empty:
        retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)]
        dayEc -= 1
        print(retVal)
    return min(retVal)
这可能导致无限循环(就像您的代码可能导致无限递归一样),因此这里有一个for循环的版本:

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
    currCodes = {...}
    retVal = False
    for day in range(dayEc, dayEc-20, -1):
        retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,day)]
        if not retVal.empty:
           break;
        print(retVal)
    if retVal.empty:
        return some_error_code
    else:
        return min(retVal)

您可以将
20
更改为不同的数字。或者使用
range(dayEc,1,-1)
——因为我怀疑这一天不应该小于
1

请在您的问题中添加一些示例数据

在代码中:

    if retVal.empty:
        dayEc = dayEc-1
        checkExchangerate(yearEc,monthEc,dayEc,currCode)
    else:
        return min(retVal)
如果retVal为空,它将递归地调用自身。但当它从递归中出来时,它对返回值不做任何处理,因此它不返回任何值

table exch_rate is pd.DataFrame: 
DAGS         USD/EUR   GRP/EUR 
1999-1-15      0,66    0,4 
1999-1-18      0,65    0,4
要解决此问题,您应该
返回从递归返回的值:

    if retVal.empty:
        dayEc = dayEc-1
        return checkExchangerate(yearEc,monthEc,dayEc,currCode)
    else:
        return min(retVal)
此外,您还可以替换:

        dayEc = dayEc-1
        return checkExchangerate(yearEc,monthEc,dayEc,currCode)

但是,我建议使用循环代替递归:

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
    currCodes = {...}
    retVal = False
    while not retVal or retVal.empty:
        retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,dayEc)]
        dayEc -= 1
        print(retVal)
    return min(retVal)
这可能导致无限循环(就像您的代码可能导致无限递归一样),因此这里有一个for循环的版本:

def checkExchangerate(yearEc,monthEc,dayEc,currCode):
    currCodes = {...}
    retVal = False
    for day in range(dayEc, dayEc-20, -1):
        retVal = exch_rate[currCodes[currCode]][exch_rate['DAGS']==dt(yearEc,monthEc,day)]
        if not retVal.empty:
           break;
        print(retVal)
    if retVal.empty:
        return some_error_code
    else:
        return min(retVal)

您可以将
20
更改为不同的数字。或者使用
range(dayEc,1,-1)
——因为我怀疑day不应该小于
1

,请添加您正在使用的两个数据帧和预期输出的示例。如果您的数据帧是exch_rate,则可以将其作为函数的参数传递:def checkExchangerate(yearEc,monthEc,dayEc,currCode,exch_rate)请添加您正在使用的两个数据帧和预期输出的示例。如果您的数据帧是exch_rate,则可以将其作为函数的参数传递:def checkExchangerate(yearEc、monthEc、dayEc、currCode、exch_rate)否不起作用。此外,日期必须尝试较低的值。返回的内容如下:ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。您能为您的问题添加一些示例数据吗?哎呀,我刚刚注意到我忘了从循环中的dayEc中减去1。现在试试。是的,这就是checkExchangerate之前缺少退货的问题。谢谢你,不行。此外,日期必须尝试较低的值。返回的内容如下:ValueError:序列的真值不明确。使用a.empty、a.bool()、a.item()、a.any()或a.all()。您能为您的问题添加一些示例数据吗?哎呀,我刚刚注意到我忘了从循环中的dayEc中减去1。现在试试。是的,这就是checkExchangerate之前缺少退货的问题。谢谢