最大不适用于for循环内的系列/列表

时间:2018-09-26 23:39:10

标签: python pandas series

我编写了以下函数,以查找我要计算的年份之前的数据集中的最新日期。我很难理解为什么它不能在for循环中工作,但是会不在一个循环中工作。如果我用硬编码值作为年份编写它,它将运行良好。但是,当我尝试将其放入循环中时,会出现以下错误:

  

“ ValueError:max()arg是一个空序列”

谢谢您对为什么会引发错误的任何见解,以及我可以采取的解决措施。

def max_date_prior_to_year(dates, yr):
     return max(dates[dates<pd.to_datetime(str(yr)+'-01-01')])

print(max_date_prior_to_year(df['Date'], 2014))
2013-10-15 00:00:00

for yr in [2011,2012,2013,2014]:
    print(max_date_prior_to_year(df['Date'], yr))
ValueError: max() arg is an empty sequence

1 个答案:

答案 0 :(得分:0)

您正在比较苹果和橘子

max_date_prior_to_year(df['Date'], 2014)作为2014参数提供yr。但是您的for循环以2011开始。如果df['Date']在2011年1月1日之前没有日期,则dates[dates<pd.to_datetime(str(yr)+'-01-01')]将返回一个空序列,因此您可以有效地进行计算:

max(pd.Series())  # ValueError: max() arg is an empty sequence

按照docs

  

如果iterable为空且未提供默认值,则ValueError   被举起。

使用pd.Series.max而不是内置的max

可以避免ValueError并提高效率的一种方法是使用pd.Series.max而不是Python内置的max 1 这将返回{{ 1}},如果布尔索引后该系列为空。因此,将您的功能更改为:

NaN

1 实际上,通常,您应该首选Pandas数值方法,而不是在pandas系列上应用内置函数。