【问题标题】:How do I create a loop for a function?如何为函数创建循环?
【发布时间】:2018-11-16 14:33:45
【问题描述】:

我有一个函数可以根据开始日期和结束日期对数据集进行排序并返回最高值。我希望创建一个 for 循环,让我可以一次性在所有五年范围内运行该函数。

def get_topName(dataset, start_year, end_year):
    subset = dataset[(dataset.year >= start_year) & (dataset.year <= end_year)
    subset2 = subset.sort_values("n" , ascending = False)
return subset3[0:1]

我希望在以下年份循环该函数:1950-1960、1960-1970、1970-1980、1980-1990 和 1990-2000。

我正在尝试这样的事情,但我无法让它工作。我也不确定如何正确创建我的日期范围列表。

for int in decades:
    get_topName(baby_df, start_year, end_year)

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以这样做:

    start_year = 1950
    end_year = 2000
    step = 10
    
    for x in range(start_year, end_year, step):
        get_topName(baby_df, x, x+step)
    

    【讨论】:

      【解决方案2】:

      由于你的函数有多个参数,你可以解压并使用 map 方法,或者使用列表推导。或者,您可以使用 itertools.partial 方法并在其上使用 map 。在这种情况下,最简单的是列表理解。这是一个例子:

      years    = range(1950, 2000, 10)
      topNames = [get_topName(dataset, start, end) for start, stop in zip(years[:-1], years[1:])]
      

      【讨论】:

      • zip 是 python 中的内置函数之一,它聚合参数中的迭代。在这种情况下,我定义了一个范围并从第一个元素到结束 -1 和从第二个元素到结束的年份进行迭代。这样你就有了上面指定的范围集。
      【解决方案3】:

      这里有一个建议,使用np.vectorize()

      import numpy as np
      
      new_func = np.vectorize(get_topName)
      output = new_func(dataset, [list_of_start_years], [list_of_end_years])
      

      来自documentation的备注,

      提供矢量化功能主要是为了方便,而不是为了提高性能。该实现本质上是一个 for 循环。

      【讨论】:

        猜你喜欢
        • 2021-12-21
        • 1970-01-01
        • 2014-04-16
        • 2019-06-07
        • 1970-01-01
        • 1970-01-01
        • 2018-01-14
        • 2022-01-17
        • 1970-01-01
        相关资源
        最近更新 更多