Pandas 中 Apply/Map 的替代品

Alternatives to Apply/Map in Pandas

我正在开发一个 ETL 过程,我想知道是否有任何替代方法可以提高我的数据转换性能。

我正在应用此函数来获取年龄和return给定年龄的所属年龄组。

def ageGroup(x):
        if x>60:
              return ">60"
        elif x>50:
              return "From 51 to 60"
        elif x>40:
              return "From 41 a 50"
        elif x>30:
              return "From 31 a 40"
        elif x>20:
              return "From 21 a 30"
        else:
              return "<21"

一开始我是用apply的

Cst["age_group"]= Cst["age"].apply(lambda x: ageGroup(x))

而这个给出的平均时间为 # --- 0.0012826919555664062 秒 ---。

然后我读了那张地图,在这种情况下速度稍快,我试了一下。

Cst["age_group"]= Cst["age"].map(ageGroup)

但只提高了一点执行时间。 (# --- 0.001134634017944336 秒 MAP --- )

所以经过研究,我发现使用 np 的另一种方法并没有像我预期的那样有效。

#     Cst["age_group"] = np.select(
 #         [
 #             Cst["age"].between(-1, 20, inclusive=True), 
 #             Cst["age"].between(21, 30, inclusive=True),
 #             Cst["age"].between(31, 40, inclusive=True),
 #             Cst["age"].between(41, 50, inclusive=True),
 #             Cst["age"].between(51, 60, inclusive=True),
 #         ], 
 #         [
 #         "<21", 
 #         "From 21 to 30",
 #         "From 31 to 40",
 #         "From 41 to 50",
 #         "From 51 to 60",
         
         
 #         ], 
 #         default=">60"
 #     )

所以我在这里只是想问你是否知道另一种方法可以使我的工作更有效率。 提前致谢。

pd.cut 您的数据有不同的 bin,提供适当的标签。

pd.cut(
    cst['age'], bins=[0, 20, 30, 40, 50, 60, np.inf], right=True, include_lowest=True,
    labels=["<21", "From 21 to 30", "From 31 to 40", "From 41 to 50", "From 51 to 60", '60+'])

请注意,此 returns 是一个分类系列。如果需要字符串,请附加 .astype(str).