我有一个带有一些缺失值的Spark Dataframe.我想通过用该列的平均值替换缺失值来执行简单的估算.我对Spark很新,所以我一直在努力实现这个逻辑.这是我到目前为止所做的事情:
a)要为单个列(比如Col A)执行此操作,这行代码似乎有效:
df.withColumn("new_Col", when($"ColA".isNull, df.select(mean("ColA"))
.first()(0).asInstanceOf[Double])
.otherwise($"ColA"))
Run Code Online (Sandbox Code Playgroud)
b)但是,我无法弄清楚,如何对我的数据帧中的所有列执行此操作.我正在尝试Map函数,但我相信它遍历数据帧的每一行
c)SO上有类似的问题 - 这里.虽然我喜欢这个解决方案(使用聚合表和合并),但我非常想知道是否有办法通过遍历每一列来实现这一点(我来自R,所以使用更高阶函数循环遍历每一列lapply对我来说似乎更自然).
谢谢!
我正在学习如何在Python上使用Imputer.
这是我的代码:
df=pd.DataFrame([["XXL", 8, "black", "class 1", 22],
["L", np.nan, "gray", "class 2", 20],
["XL", 10, "blue", "class 2", 19],
["M", np.nan, "orange", "class 1", 17],
["M", 11, "green", "class 3", np.nan],
["M", 7, "red", "class 1", 22]])
df.columns=["size", "price", "color", "class", "boh"]
from sklearn.preprocessing import Imputer
imp=Imputer(missing_values="NaN", strategy="mean" )
imp.fit(df["price"])
df["price"]=imp.transform(df["price"])
Run Code Online (Sandbox Code Playgroud)
但是,这会引发以下错误:ValueError:值的长度与索引的长度不匹配
我的代码有什么问题???
谢谢你的帮助
我有一个数据集将丢失一些看起来像这样的数据:
id category value
1 A NaN
2 B NaN
3 A 10.5
4 C NaN
5 A 2.0
6 B 1.0
Run Code Online (Sandbox Code Playgroud)
我需要填写空值来使用模型中的数据.每次类别第一次出现时,它都是NULL.我想要的方法是对类似的情况A
和B
具有多个值的情况用该类别的平均值替换空值.对于C
仅出现一次的类别,只需填写其余数据的平均值即可.
我知道我可以简单地执行此操作C
以获得所有行的平均值,但我仍然试图为A和B执行分类方法并替换空值.
df['value'] = df['value'].fillna(df['value'].mean())
Run Code Online (Sandbox Code Playgroud)
我需要最终的df是这样的
id category value
1 A 6.25
2 B 1.0
3 A 10.5
4 C 4.15
5 A 2.0
6 B 1.0
Run Code Online (Sandbox Code Playgroud) 我想svyglm
在使用多重插补时从模型的结果中获取 p 值。下面是一个可重现的示例。
library(tibble)
library(survey)
library(mitools)
# Data set 1
# Note that I am excluding the "income" variable from the "df"s and creating
# it separately so that it varies between the data sets. This simulates the
# variation with multiple imputation. Since I am using the same seed
# (i.e., 123), all the other variables will be the same, the only one that
# will vary will be "income."
set.seed(123)
df1 <- tibble(id = seq(1, …
Run Code Online (Sandbox Code Playgroud) 我试图用我的数据中的一些缺失值替换来自类似组的平均值.
我的数据如下:
X Y
1 x y
2 x y
3 NA y
4 x y
Run Code Online (Sandbox Code Playgroud)
我希望它看起来像这样:
X Y
1 x y
2 x y
3 y y
4 x y
Run Code Online (Sandbox Code Playgroud)
我写了这个,它有效
for(i in 1:nrow(data.frame){
if( is.na(data.frame$X[i]) == TRUE){
data.frame$X[i] <- data.frame$Y[i]
}
}
Run Code Online (Sandbox Code Playgroud)
但是我的data.frame几乎有五十万行,而for/if语句非常慢.我想要的是类似的东西
is.na(data.frame$X) <- data.frame$Y
Run Code Online (Sandbox Code Playgroud)
但这会导致不匹配的大小错误.似乎应该有一个命令来执行此操作,但我无法在SO或R帮助列表中找到它.有任何想法吗?
我有一个同时包含随机缺失(MAR)和审查数据的数据集。这些变量是相关的,因此我尝试有条件地估算缺失的数据,以便可以估计相关的多元正态分布的分布参数。我想使用Gibbs MCMC,但是很难执行该程序。我的数据框有5个变量(表示为x1:x5),1099个样本,其中包含MAR,检查值和观察值的某种组合。到目前为止,这是我尝试过的:
# packages
library(msm, tmvtnorm, MCMCpack)
# priors
theta0<-c(rep(0, 5))
Sigma0<-S0<-diag(5)
nu0<-4
# initialize parameters
theta<-c(rep(0, 5))
Tau<-diag(5)
# initialize output matrix
n_samples <- 1000
mu_MCMC <- matrix(0, nrow = n_samples, ncol = 5)
mu_MCMC[1,] <- theta
cov_MCMC <- matrix(0, nrow = n_samples, ncol = 25)
cov_MCMC[1,] <- c(diag(5))
# detection limits
det_lim <- matrix(c(-1.7, 0, 0, 0, 0), nrow = 1, ncol = 5)
# function to detect NaN (i.e., below detection data)
is.nan.data.frame <- function(x)
do.call(cbind, lapply(x, …
Run Code Online (Sandbox Code Playgroud) 我正在探索statsmodels.imputation.mice包用于输入缺失值.但是,除了http://www.statsmodels.org之外,我还没有看到它的任何使用示例.从我收集的内容中,可以创建一个mouse.MICEData实例并将其与mice.MICE().fit()结合使用.来自http://www.statsmodels.org/dev/generated/statsmodels.imputation.mice.MICE.html的示例
>>> imp = mice.MICEData(data)
>>> fml = 'y ~ x1 + x2 + x3 + x4'
>>> mice = mice.MICE(fml, sm.OLS, imp)
>>> results = mice.fit(10, 10)
>>> print(results.summary())
Run Code Online (Sandbox Code Playgroud)
但是,MiceData实例中的估算值并不固定.我的意思是,如果
imp = mice.MICEData(data)
Run Code Online (Sandbox Code Playgroud)
每次通话
imp.update('x1')
Run Code Online (Sandbox Code Playgroud)
(假设数据有一列'x1')使用"预测均值匹配"为缺失值绘制一个新样本.如果我将MICEDdata与MICE.fit()一起使用,这一切都很好.但是,假设我想使用此程序包将值重写一次,然后使用另一个程序包中的预测程序(例如来自sklearn)来拟合数据.我想知道,什么是合理的方法.我可以多次运行更新并对每个缺失值进行平均预测.或者,我可以创建具有不同插补值的多个数据集并适合每个集合.但是,如果我的数据集很大,那么它可能会非常昂贵.
我有三个层次分类变量(A
,B
,和C
)。
我还有一个连续变量,上面有一些缺失值。
我想NA
用其组的平均值替换这些值。A
也就是说, group 中缺失的观察值必须替换为 group 的平均值A
。
我知道我可以计算每个组的平均值并替换缺失值,但我确信还有另一种方法可以通过循环更有效地做到这一点。
A <- subset(data, group == "A")
mean(A$variable, rm.na = TRUE)
A$variable[which(is.na(A$variable))] <- mean(A$variable, na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)
现在,我知道我可以对 group B
and做同样的事情C
,但也许for
循环(with if
and else
)可能会起作用?
我正在使用 scikit 库迈出第一步,发现自己只需要回填数据框中的某些列。
我已经仔细阅读了文档,但我仍然不知道如何实现这一点。
为了使这更具体,假设我有:
A = [[7,2,3],[4,np.nan,6],[10,5,np.nan]]
Run Code Online (Sandbox Code Playgroud)
我想用平均值而不是第三列填充第二列。如何使用 SimpleImputer(或其他辅助类)执行此操作?
由此演变而来,自然的后续问题是:如何用平均值填充第二列,用常数填充最后一列(显然,仅适用于没有值的单元格)?
我是 R 包装新手mice
。但我正在尝试从中估算 5 个数据集popmis
,然后为每个数据集拟合一个模型,最后在它们之间拟合一个lmer()
模型。with()
pool()
我认为pool()
中的函数mice()
不适用于lmer()
来自lme4
包的调用,对吧?
如果是这种情况,有没有办法编写一个定制的函数,其作用类似于pool()
我下面的案例?
library(mice)
library(lme4)
imp <- mice(popmis, m = 5) # `popmis` is a dataset from `mice`
fit <- with(imp, lme4::lmer(popular ~ sex + (1|school))) # works fine.
pool(fit) # BUT this one fails, should I loop here?
Run Code Online (Sandbox Code Playgroud) imputation ×10
missing-data ×6
r ×5
python ×3
pandas ×2
scikit-learn ×2
apache-spark ×1
data-science ×1
dataframe ×1
lme4 ×1
loops ×1
r-mice ×1
replace ×1
scala ×1
statsmodels ×1
survey ×1