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)
虽然很烦人,但 pandas.NA 仍然相对较新,并且不支持所有 numpy ufunc。奇怪的是,我在尝试将“dogs”列的 dtype 从 object -> float 更改时也遇到错误,这对我来说似乎是一个错误。不过,有几种选择可以实现您想要的结果:
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)
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)
df['dogs'] = df['dogs'].apply(lambda x: round(x,2) if str(x) != '<NA>' else x)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4321 次 |
最近记录: |