#python #pandas
Вопрос:
Я пытаюсь красиво распечатать фреймы данных Pandas с обнуляемым целочисленным содержимым. DataFrame.to_string()
Метод имеет необязательный аргумент, na_rep
, который можно использовать для переопределения способа печати нулей с плавающей запятой. По крайней мере, в Pandas 1.2.4 это, похоже, не влияет на то, как печатаются целочисленные объекты с нулевым значением. В приведенном ниже минимальном примере метод возвращает строку "<NA>"
, когда мне нужен пробел.
Минимальный пример:
import pandas as pd
print(f"nPandas version = {pd.__version__}")
index = list("abcd")
columns = list("efghjk")
df1 = pd.DataFrame(index=index, columns=columns)
df2 = pd.DataFrame(index=index, columns=columns, dtype=pd.Int32Dtype())
for df in (df1, df2):
df.at["c", "h"] = 7 # Some non-null content
print("n", df.to_string(na_rep=""))
Выход:
Pandas version = 1.2.4
e f g h j k
a
b
c 7
d
e f g h j k
a <NA> <NA> <NA> <NA> <NA> <NA>
b <NA> <NA> <NA> <NA> <NA> <NA>
c <NA> <NA> <NA> 7 <NA> <NA>
d <NA> <NA> <NA> <NA> <NA> <NA>
Комментарии:
1.Очень интересно, что
na_rep
специально настроено специально для игнорированияNaN
соседних типовpd.NA
None
, иpd.NaT
будет использовать их собственное форматирование перед рассмотрениемself.na_rep
. Источник для формата (github.com/pandas-dev/pandas/blob/master/pandas/io/formats/…) MRE ->pd.DataFrame([[pd.NA, np.nan, pd.NaT, None]]).to_string(na_rep='-')
2. @HenryEcker Спасибо, это интересно, и мне интересно, почему. Так что, похоже, мне, возможно, придется сделать что-то неуклюжее, чтобы достичь желаемого результата.
3. Если вы находитесь в ноутбуке jupyter, Styler.format соответствующим образом обрабатывает значения all
NaN
-like -> >pd.DataFrame([[pd.NA, np.nan, pd.NaT, None]]).style.format(na_rep='-')
Источник для styler.формат na_rep ( github.com/pandas-dev/pandas/blob/v1.3.3/pandas/io/formats/… )
Ответ №1:
Это сработает:
import pandas as pd
print(f"nPandas version = {pd.__version__}")
index = list("abcd")
columns = list("efghjk")
df1 = pd.DataFrame(index=index, columns=columns)
df2 = pd.DataFrame(index=index, columns=columns, dtype=pd.Int32Dtype())
for df in (df1, df2):
df.at["c", "h"] = 7 # Some non-null content
print("n", df.astype('float64').to_string(float_format='%d', na_rep=""))