【发布时间】:2015-11-24 21:44:47
【问题描述】:
假设我们有一个test 数据集:
value group
123 1
120 1
NA 1
130 1
23 2
22 2
24 2
NA 2
现在我们想用group-wise 中值替换缺失值。在R 中,我们可以使用嵌套的ifelse 调用来实现。
first.med <- median(test[test$group == 1, ]$value, na.rm = T)
second.med <- median(test[test$group == 2, ]$value, na.rm = T)
test$value <- ifelse(is.na(test$value) & test$group == 1, first.med
ifelse(is.na(test$value) & test$group == 2, second.med,
test$value))
我想应用numpy.where 函数或pandas.DataFrame.Set.map 方法,如here 所示,但这两种技术都不支持嵌套。我可以想到一个列表理解来做到这一点,但我想知道在 NumPy/pandas 领域是否有替代方案。提前谢谢你。
【问题讨论】:
-
为什么需要嵌套 if-else 语句?例如,在 r 中这通常是不好的做法,您可以简单地执行
with(test, ave(value, group, FUN = function(x) {x[is.na(x)] <- median(x, na.rm = TRUE); x}))这将适用于 n 个组 -
您需要了解groupby /"Split-Apply-Combine"。这是一个非常强大的范式。还有更干净的代码。根据@chrisb 的回答
-
@rawr 我只是习惯了
ifelse。你的 sn-p 看起来确实好多了。