在 pandas 中更快地将函数应用于每一行的方法

3

我有一个包含从1到10的数字的列(“color_values”)在我的df中,我想使用matplotlib.cm (cm)matplotlib.colors (mcol)将这些数字转换为十六进制颜色。

这里是我创建调色板的代码:

color_list = ["#084594", ...] # my colors
cm1 = mcol.ListedColormap(color_list)
cnorm = mcol.Normalize(vmin=df["color_values"].min(), vmax=df["color_values"].max())
cpick = cm.ScalarMappable(norm=cnorm, cmap=cm1)
cpick.set_array(np.array([]))

这是需要更快的部分,因为我有数百万行数据:

df["color_hex"] = df.apply(
            lambda row: mcol.to_hex(cpick.to_rgba(row["color_values"])), axis=1
    )

我正在插入另一列(color_hex),将从color_values中的值转换为十六进制颜色,但它通过循环遍历每个单元格来实现。

我查看了numpy.vectorize,但在他们的文档中,他们说“矢量化函数主要是为方便而提供的,而不是为性能而提供的。 实现本质上是一个for循环。”

我还查看了numpy.where,但这似乎更适合您需要满足条件的情况,而这并非我的情况。

所以我想知道还有哪些numpy操作适用于此?


1
实际问题已在此问题中得到解决。如果仍然希望不必要地使用matplotlib,请查看此答案中的apply2情况,该情况使用numpy.apply_along_axis - ImportanceOfBeingErnest
1个回答

5

有两种方法可以提高性能。没有数据很难确认是否确实如此。

1. 使用pd.Series.apply而不是pd.DataFrame.apply

df['color_hex'] = df['color_values'].apply(lambda x: mcol.to_hex(cpick.to_rgba(x)))

这样可以减少需要通过循环传递的结构化数据量。
2. 使用列表推导式。
df['color_hex'] = [mcol.to_hex(cpick.to_rgba(x)) for x in df['color_values']]

这是因为列表可以直接赋值给一个pd.Series

哪个更快? - Gonzalo Garcia
1
@GonzaloGarcia,如果你的数据干净,可能使用列表推导式。建议您使用自己的数据进行测试。 - jpp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接