我的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([]))
这是需要更快的部分,因为我有数百万行:
df["color_hex"] = df.apply(
lambda row: mcol.to_hex(cpick.to_rgba(row["color_values"])), axis=1
)
我插入了另一个列(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操作适合这个吗?
答案 0 :(得分:2)
有两种方法可以提高性能。没有数据,很难确定是否确实如此。
<强> 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
。