pd.dataframe: проблема форматирования итоговой строки с пустыми ячейками

#python-3.x #pandas

#python-3.x #панды

Вопрос:

Относительно новичок в pandas, и я пытаюсь сделать что-то, что, по моему мнению, должно быть простым, но это становится очень сложным. Либо я делаю это неправильно, либо я недооценил pandas.

Я пытаюсь добавить в фрейм данных одну строку «Итогов», содержащую только один столбец и игнорирующую остальные, и отобразить ее без NaN с правильно отформатированными числами. Преобладающий совет, по-видимому, заключается в замене NaN пустой строкой df.fillna("") , но это нарушает нормальное форматирование чисел для этого столбца

Я создаю простую таблицу и добавляю строку с итоговой суммой единственного интересующего меня столбца:

 import pandas as pd, numpy as np

df = pd.DataFrame([['A', 2.22,3.33],['B', 4.44, 5.55],['C',6.66,7.77]], columns=['foo', 'bar', 'baz'])
total_row = pd.DataFrame([['Total',df['baz'].sum()]], columns=['foo', 'baz'])
df = df.append(total_row, ignore_index=True)
  
 >>> df
     foo   bar    baz
0      A  2.22   3.33
1      B  4.44   5.55
2      C  6.66   7.77
3  Total   NaN  16.65
  

… Теперь у меня есть итоговая строка с правильным итогом. Замените NaN пустой строкой:

 df.replace(np.nan, "")
     foo   bar    baz
0      A  2.22   3.33
1      B  4.44   5.55
2      C  6.66   7.77
3  Total        16.65
  

Затем отформатируйте только столбец ‘bar’ в 1DP

 format_dict = {
    'bar':             "{:,.1f}"
}
styled_df = df.style.format(format_dict)
styled_df.render()
...
ValueError: Unknown format code 'f' for object of type 'str'
  

Стиль.формат по понятным причинам жалуется на попытку форматирования строки до 1 знака после запятой. Я решил это, написав пользовательский форматировщик для ‘bar’, который игнорирует строки:

 format_dict = {
    'bar': lambda x: x if type(x) == str else f"${x:,.2f}"
}
  

Это кажется излишне сложным для того, что я считал обычным вариантом использования. Есть ли более простой способ создания этой итоговой строки или форматирования таблицы?

Ожидаемый результат:

      foo   bar    baz
0      A  2.2    3.33
1      B  4.4    5.55
2      C  6.6    7.77
3  Total        16.65
  

Ответ №1:

Вы не упоминаете столбец bar в списке столбцов, т.е.

 pd.DataFrame([['Total', df['baz'].sum()]], columns=['foo', 'baz']), 
  

в строке он добавит NaN, чтобы сократить это, просто сделайте это

 pd.DataFrame([['Total','',df['baz'].sum()]], columns=['foo','bar', 'baz']).
  

нажмите здесь

Комментарии:

1. Это немного более быстрый способ получить пустую строку в [‘Total’][‘bar’] за счет необходимости указывать каждый столбец df в определении total_row . Но у него все та же проблема с нарушением форматирования столбца bar.