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之前缺少退货的问题。谢谢