pandas применить стиль и изменить содержимое ячейки - PullRequest
2 голосов
/ 08 марта 2020

Для кадра данных: enter image description here

Я могу применить стиль: enter image description here

Но вместо этого я хочу удалить последнее значение из триплета и закодировать его, используя стилизацию. Т.е.: enter image description here

Однако я не знаю, как объединить оба шага. Для pandas 25.x pandas сохранение стиля при переформатировании ячеек - без повторной обработки строки в числах демонстрирует возможный ответ, однако мне нужно, чтобы это работало для pandas 1.0.1.

df = pd.DataFrame({'foo': {'first': ['-0.89495', '0.48868', '0.06978'],
  'second': ['0.50249', '0.07999', '0.00000'],
  '3rd': ['-0.75436', '0.20239', '0.00031']},
 'bar': {'first': ['-0.49294',
   '0.61195',
   '0.42228'],
  'second': ['0.35000', '0.10999', '0.00191'],
  '3rd': ['-0.62354', '0.28775', '0.03250']}})

def highlight_significant(x, sign_level_1, sign_level_2):
    if x is np.nan:
        return ''
    else:
        if isinstance(x, list):
            p_value = float(x[2])
            if float(x[0]) > 0:
                if p_value < sign_level_2:
                    return 'font-weight: bold;background-color: lightgreen'
                elif p_value < sign_level_1:
                    color = 'lightgreen'
                    return 'background-color: %s' % color
                else:
                    return ''
            else:
                if p_value < sign_level_2:
                    return 'font-weight: bold;background-color: yellow'
                elif p_value < sign_level_1:
                    color = 'yellow'
                    return 'background-color: %s' % color
                else:
                    return ''
        else:
            return ''

display(df)

display(df.style.applymap(highlight_significant, sign_level_1=0.05, sign_level_2=0.01))

def format_regression_results(r):
    if len(r)> 1:
        coefficient = r[0]
        std_err = r[1]
        p_value = round(float(r[2]), rounding_digits)
        result = f'{round(float(coefficient), rounding_digits)} ({round(float(std_err), rounding_digits)})'        
        return result
    else:
        return '-'

df.foo = df.foo.apply(format_regression_results)
df.bar = df.bar.apply(format_regression_results)
df

edit

Действительно:

def make_float(x):
    return [float(x[0]), float(x[1]), float(x[2])]

df.foo = df.foo.apply(make_float)
df.bar = df.bar.apply(make_float)

возможно преобразовать строки в числа с плавающей точкой. enter image description here

Работает переформатирование:

styles = lambda x: df.applymap(lambda x: highlight_significant(x, sign_level_1=0.05, sign_level_2=0.01))
dx = df.applymap(lambda x: f'{x[0]}({round(float(x[1]), 2)})')
display(dx)

. Тем не менее, стиль все еще теряется.

1 Ответ

0 голосов
/ 08 марта 2020

Используя различные цвета и значения с плавающей запятой, appraoch, выделенный из pandas, сохраняет стилизацию при переформатировании ячеек - без повторного разбора строки на числа работает просто отлично.

def make_float(x):
    return [float(x[0]), float(x[1]), float(x[2])]

df.foo = df.foo.apply(make_float)
df.bar = df.bar.apply(make_float)

display(df)

def highlight_significant(x, sign_level_1, sign_level_2):
    if x is np.nan:
        return ''
    else:
        if isinstance(x, list):
            p_value = float(x[2])
            if float(x[0]) > 0:
                if p_value < sign_level_2:
                    return 'font-weight: bold;background-color: cyan'
                elif p_value < sign_level_1:
                    color = 'cyan'
                    return 'background-color: %s' % color
                else:
                    return ''
            else:
                if p_value < sign_level_2:
                    return 'font-weight: bold;background-color: yellow'
                elif p_value < sign_level_1:
                    color = 'yellow'
                    return 'background-color: %s' % color
                else:
                    return ''
        else:
            return ''

styles = lambda x: df.applymap(lambda x: highlight_significant(x, sign_level_1=0.05, sign_level_2=0.01))
dy = df.applymap(lambda x: f'{x[0]}({round(float(x[1]), 2)})')
display(dy)
dy.style.apply(styles, axis=None)
...