问题描述
我有一个大数据框,在不同的列中包含 inf 和 -inf 值。我想用 NaN 替换所有 inf、-inf 值
我可以逐列这样做。所以这是有效的:
df['column name'] = df['column name'].replace(np.inf,np.nan)
但是我的代码在一次遍历数据帧时没有这样做。
df.replace([np.inf,-np.inf],np.nan)
输出不会替换 inf 值
解决方法
您可以使用applymap()
:
df = df.applymap(lambda x: np.nan if x == np.inf else x)
,
pandas.Series.replace
不会就地发生 (taken from here)。
因此,您的代码替换整个数据帧的问题不起作用,因为您需要将其重新分配或添加 ``` r
x<-(c(4,3,5,6,2,1))
df<-as.data.frame(x)
func<- function(x){
res <- rep(NA,length(x))
for(i in seq(1,length(x))){
if(i%%2 == 1){
res[i] = x[i]/ifelse(i==length(x),NA,x[i+1])+x[i]}
else if(i%%2 == 0){
res[i] = x[i]/ifelse(i==1,x[i-1])+x[i]}
}
res
}
func(df$x)
#> [1] 5.333333 3.750000 5.833333 7.200000 4.000000 1.500000
library(dplyr)
df %>% mutate(x = ifelse(row_number()%%2,x/lead(x)+x,x/lag(x)+x))
#> x
#> 1 5.333333
#> 2 3.750000
#> 3 5.833333
#> 4 7.200000
#> 5 4.000000
#> 6 1.500000
作为参数。这也是您的逐列有效的原因,因为您将其分配回 inplace=True
因此,将 df['column name'] = ...
更改为:
df.replace([np.inf,-np.inf],np.nan)
或者分配回一个新的数据帧:
df.replace([np.inf,np.nan,inplace=True)