我正在开发一个ETL过程,我想知道是否有其他方法可以提高我的数据转换性能。
我正在应用这个函数来获取年龄,并返回给定年龄的所属年龄组。
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.00112826919555664062秒的平均时间。
然后我读了那张地图,在这种情况下稍微快一点,我试了一下
Cst["age_group"]= Cst["age"].map(ageGroup)
但只会稍微提高执行时间。(#---0.0011134634017944336秒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
您的数据具有各种存储箱,并提供适当的标签。
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+'])
请注意,这将返回一个分类序列。如果需要字符串,请附加.astype(str)
。