Есть ли простой способ изменить способ, которым pandas печатает целочисленные нули?

#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=""))