Pandas dataframe - форматирование определенных строк или ячеек до 2 dp - PullRequest
1 голос
/ 21 января 2020

Со следующим кадром данных я хотел бы переформатировать первые две строки в 2 десятичных знака.

       A         B    C        D     E   F
0     68        45        1843.4    98
1  978.1             23              3    
2                                  
3          49889.2   80              

Я пробовал методы, такие как:

df.iloc[0:1,:].style.format("{0:.2f}")

Для других проектов я также хотел бы отформатировать определенные ячейки, такие как столбец B, индекс 3 до 49889,20 (2 dp) Можно ли использовать подобный подход для этого?

Спасибо за любую помощь

Дополнительная информация: Для некоторого контекста того, что я делаю, я создаю смешанную строку / float dataframe для печати через pylatex в формат LaTeX tex и PDF (см. вывод PDF ниже). PDF-файл печатает фактический фрейм данных, поэтому PDF-файл показывает фрейм данных идентично, как если бы он выводился в python. Я хотел бы отобразить значения до 2 дп, поскольку они являются финансовыми показателями. Предпочтительно это будет редактироваться в кадре данных, а не в процессе Pylatex. то есть, поэтому pylatex просто печатает информационный кадр. Все вычисления будут выполнены до публикации PDF, поэтому нет проблем с преобразованием значений в строки. Спасибо. enter image description here

Ответы [ 3 ]

3 голосов
/ 21 января 2020

Значения изменяются на строки, но это возможно:

df.iloc[:2] = df.iloc[:2].applymap('{0:.2f}'.format)
print (df)
      A        B      C        D      E    F
0  0.00    68.00  45.00  1843.40  98.00  nan
1  1.00   978.10  23.00     3.00    nan  nan
2     2      NaN    NaN      NaN    NaN  NaN
3     3  49889.2     80      NaN    NaN  NaN

РЕДАКТИРОВАТЬ: Для пользовательской функции с try-except использовать:

def func(x):
    try:
        return '{0:.2f}'.format(x)
    except:
        return x

df = df.applymap(func)
1 голос
/ 21 января 2020

Чтобы построить ответ @ jezrael, вы можете передать словарь для столбцов:

import pandas as pd
import numpy
import string

#create some random data
df = pd.DataFrame({k:v for k,v in zip(list(string.ascii_uppercase[:5]), np.random.random_sample((5,5)))})

       A            B           C           D           E
0   0.995053    0.032561    0.556866    0.565944    0.613636
1   0.586174    0.932380    0.567946    0.277729    0.883482
2   0.210020    0.992571    0.626377    0.070947    0.723614
3   0.478476    0.866163    0.197633    0.621722    0.532891
4   0.743204    0.823418    0.616961    0.182829    0.642123

Затем, используя df.style.format({'B': "{:.2f}", 'D': '{:+.2f}'}), вы получите:

       A         B          C         D        E
0   0.424395    0.23    0.960664    +0.96   0.992401
1   0.414769    0.57    0.664916    +0.73   0.850706
2   0.147415    0.88    0.873205    +0.12   0.33699
3   0.3742      0.28    0.496887    +0.74   0.885727
4   0.270247    0.67    0.501478    +0.10   0.113295

Для полноты:

def conditional_formatter(value):
    return "{:.2f}".format(value) if not isinstance(value, str) else value

df.applymap(conditional_formatter)
0 голосов
/ 21 января 2020

Форматирование строк в pandas DataFrame довольно странно, так как типы стандартно определены для столбца, возможно, изменение этого (ориентация) может помочь. Что может сработать, так это метод .Round (), который можно вызывать в DataFrames. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.round.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...