панды.DataFrame.round() не принимает pd.NA или pd.NAN

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

версия pandas: 1.2

У меня есть фрейм данных, который содержит столбцы как ‘float64’ с нулевыми значениями, представленными как pd.NAN. Есть ли способ округления без преобразования в строку, а затем в десятичную:

 df = pd.DataFrame([(.21, .3212), (.01, .61237), (.66123, .03), (.21, .18),(pd.NA, .18)],
                  columns=['dogs', 'cats'])
df
      dogs     cats
0     0.21  0.32120
1     0.01  0.61237
2  0.66123  0.03000
3     0.21  0.18000
4     <NA>  0.18000
  

Вот что я хотел сделать, но это ошибка:

 df['dogs'] = df['dogs'].round(2)
  

Ошибка типа: аргумент float () должен быть строкой или числом, а не «NAType»

Вот еще один способ, который я пробовал, но он молча терпит неудачу, и преобразование не происходит:

 tn.round({'dogs': 1})

      dogs     cats
0     0.21  0.32120
1     0.01  0.61237
2  0.66123  0.03000
3     0.21  0.18000
4     <NA>  0.18000
  

Ответ №1:

Хотя это раздражает, панды.NA все еще относительно новый и не поддерживает ВСЕ numpy ufuncs. Как ни странно, я также сталкиваюсь с ошибками при попытке изменить dtype столбца «dogs» из object -> float, что кажется мне ошибкой. Есть несколько альтернатив, с помощью которых вы можете достичь желаемого результата:

  • замаскируйте NA и округлите остальную часть столбца
 na_mask = df["dogs"].notnull()
df.loc[na_mask, "dogs"] = df.loc[na_mask, "dogs"].astype(float).round(1)

print(df)
   dogs     cats
0   0.2  0.32120
1     0  0.61237
2   0.7  0.03000
3   0.2  0.18000
4  <NA>  0.18000
  
  • Замените pd.NA с помощью np.nan, а затем round
 df = df.replace(pd.NA, np.nan).round({"dogs": 1})

print(df)
   dogs     cats
0   0.2  0.32120
1   0.0  0.61237
2   0.7  0.03000
3   0.2  0.18000
4   NaN  0.18000
  

Ответ №2:

 df['dogs'] = df['dogs'].apply(lambda x: round(x,2) if str(x) != '<NA>' else x)
  

Ответ №3:

Работает ли следующий код?

 import pandas as pd
import numpy as np

df = pd.DataFrame([(.21, .3212), (.01, .61237), (.66123, .03), (.21, .18), (np.nan, .18)],
                  columns=['dogs', 'cats'])

df['dogs'] = df['dogs'].round(2)
print(df)
  

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

1. На самом деле это не отвечает на мой вопрос, но предлагает способ изменить данные для работы, не показывая, как изменить данные.