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

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

df = pd.DataFrame({'R':[152,186,86], 'G':[112,191,121], 'B':[85,222,180] })

def rgb_to_hex(red, green, blue):
    """Return color as #rrggbb for the given color values."""
    return '#%02x%02x%02x' % (red, green, blue)

При этом коде возникает ошибка:

df['hex'] = rgb_to_hex(df['R'],df['G'],df['B'])

со следующей ошибкой:

Ошибка типа:% x формат: целое числотребуется, а не серия

Есть мысли?

Ответы [ 3 ]

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

Понимание списка будет работать:

df = pd.DataFrame({'R':[152,186,86], 'G':[112,191,121], 'B':[85,222,180] })

['#%02x%02x%02x' % (df['R'][i], df['G'][i], df['B'][i]) for i in range(len(df))]

Out

['#987055', '#babfde', '#5679b4']

Если вы хотите индекс строки:

[(df.index[i], '#%02x%02x%02x' % (df['R'][i], df['G'][i], df['B'][i])) for i in range(len(df))]

#out
[(0, '#987055'), (1, '#babfde'), (2, '#5679b4')]
0 голосов
/ 21 декабря 2018

Оператор % не может работать с последовательностями так, как вы этого хотите.Вместо этого вы должны использовать метод .apply в кадре данных, чтобы передать каждую строку индивидуально для вашей функции:

df['hex'] = df.apply(lambda r: rgb_to_hex(*r), axis=1)

     R    G    B      hex
0  152  112   85  #987055
1  186  191  222  #babfde
2   86  121  180  #5679b4

Вместо того, чтобы назначать столбец на месте, я рекомендую использовать метод .assign для возвратадругой фрейм данных, просто чтобы держать вещи "чистыми" в смысле функционального программирования:

df2 = df.assign(hex=df.apply(lambda r: rgb_to_hex(*r), axis=1))
0 голосов
/ 21 декабря 2018

РЕДАКТИРОВАТЬ: см. Ответ от @ PaulH для лучшего подхода.

Вам необходимо выполнить преобразование для каждой строки в DataFrame (или получить доступ к определенной строке) для генерации шестнадцатеричных значений, которые вы ищете.Например:

import pandas as pd

df = pd.DataFrame({'R':[152,186,86], 'G':[112,191,121], 'B':[85,222,180]})

for i, r, g, b in df.itertuples():
    print('#{:02x}{:02x}{:02x}'.format(r, g, b))

# OUTPUT
# #987055
# #babfde
# #5679b4
...