#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.