更快地将函数应用于熊猫中的每一行

Cla*_*nga 3 python performance numpy pandas

我在我的DF一列(“color_values”),还有一些数字1到10,我想这些数字转换为十六进制的色彩搭配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([]))
Run Code Online (Sandbox Code Playgroud)

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

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

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

我看了看numpy.vectorize,但在他们的文档中他们说The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop

我也看过,numpy.where但当你有一个条件要满足时,这似乎更合适,这不是我的情况。

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

jpp*_*jpp 5

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

1.用pd.Series.apply代替pd.DataFrame.apply

df['color_hex'] = df['color_values'].apply(lambda x: mcol.to_hex(cpick.to_rgba(x)))
Run Code Online (Sandbox Code Playgroud)

这减少了需要通过循环传递的结构化数据量。

2. 使用列表理解

df['color_hex'] = [mcol.to_hex(cpick.to_rgba(x)) for x in df['color_values']]
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为列表可以直接分配给pd.Series.