pandas.DataFrame.round() 不接受 pd.NA 或 pd.NAN

vfr*_*k66 6 python dataframe 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
Run Code Online (Sandbox Code Playgroud)

这是我想做的,但它出错了:

df['dogs'] = df['dogs'].round(2)
Run Code Online (Sandbox Code Playgroud)

TypeError: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
Run Code Online (Sandbox Code Playgroud)

Cam*_*ell 8

虽然很烦人,但 pandas.NA 仍然相对较新,并且不支持所有 numpy ufunc。奇怪的是,我在尝试将“dogs”列的 dtype 从 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
Run Code Online (Sandbox Code Playgroud)
  • 将 pd.NA 替换为 np.nan,然后进行舍入
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
Run Code Online (Sandbox Code Playgroud)


gañ*_*fla 2

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