Создайте шестнадцатеричный столбец из красного столбца, зеленого столбца и синего столбца в пандах - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть фрейм данных панд с 16 777 216 строками.Это каждая возможная комбинация трех столбцов (красный, зеленый и синий) от 0 до 255. включительно.

Я хотел бы добавить столбец к этому фрейму данных, который представляет собой шестнадцатеричный код трех значений строки,Я думал, что что-то вроде ниже было бы лучшим решением:

df["Hex"] = "#{0:02x}{1:02x}{2:02x}".format(df["Red"],df["Green"],df["Blue"])

Однако, похоже, вы не можете передать серию в метод строкового формата.

Есть ли способобойти эту проблему?Кроме того, это был бы самый эффективный способ сделать это, учитывая, что кадр данных довольно велик?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Для Python 3.6+ можно использовать очень быстро f-string s:

z = zip(df['Red'], df['Blue'], df['Green'])
df["Hex"] = [f'#{R:02X}{B:02X}{G:02X}' for R,B,G in z]

Для более низких версий:

df["Hex"] = ['#{0:02X}{1:02X}{2:02X}'.format(R,B,G) for R,B,G in z]

Спасибо @Jon за улучшение решения:

df["Hex"] = ['#{0:02X}{1:02X}{2:02X}'.format(*el) for el in z]

Производительность :

#10000 rows
df = pd.DataFrame(np.random.randint(256, size=(10000, 3)), columns=['Red', 'Green', 'Blue'])

In [244]: %%timeit 
     ...: z = zip(df['Red'], df['Green'], df['Blue'])
     ...: df["Hex"] = [f'#{R:02X}{B:02X}{G:02X}' for R,B,G in z]
     ...: 
12.9 ms ± 45.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


In [245]: %%timeit
     ...: z = zip(df['Red'], df['Green'], df['Blue'])
     ...: df["Hex"] = ['#{0:02X}{1:02X}{2:02X}'.format(R,B,G) for R,B,G in z]
     ...: 
12.4 ms ± 1.14 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)


In [246]: %%timeit
     ...: z = zip(df['Red'], df['Green'], df['Blue'])
     ...: df["Hex"] = ['#{0:02X}{1:02X}{2:02X}'.format(*el) for el in z]
     ...: 
11.3 ms ± 55 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [246]: %%timeit
     ...: df["Hex"] = df.apply('#{Red:02X}{Green:02X}{Blue:02X}'.format_map, axis=1)
     ...: 
346 ms ± 42.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
0 голосов
/ 20 декабря 2018

Вы можете использовать .apply, например:

df = pd.DataFrame(np.random.randint(256, size=(10, 3)), columns=['Red', 'Green', 'Blue'])

Например:

   Red  Green  Blue
0  125    100   174
1  107    247   235
2  230    254    33
3   91    107    33
4  209    220   232
5  175     10    47
6  120     66    44
7   21    136   254
8  226    237    32
9   89     57    71

Тогда:

df.apply('#{Red:02X}{Green:02X}{Blue:02X}'.format_map, axis=1)

Дает вам:

0    #7D64AE
1    #6BF7EB
2    #E6FE21
3    #5B6B21
4    #D1DCE8
5    #AF0A2F
6    #78422C
7    #1588FE
8    #E2ED20
9    #593947
dtype: object
...