我有一个缺少“SNAP_ID”值的数据帧。我想根据前一个非缺失值(lag()?)的序列,用浮点值填充缺失值。如果可能的话,我真的想只用dplyr来实现这一点。
假设:
当前数据:
end SNAP_ID
1 2015-06-26 12:59:00 365
2 2015-06-26 13:59:00 366
3 2015-06-27 00:01:00 NA
4 2015-06-27 23:00:00 NA
5 2015-06-28 00:01:00 NA
6 2015-06-28 23:00:00 NA
7 2015-06-29 09:00:00 367
8 2015-06-29 09:59:00 368
我想要实现的目标:
end SNAP_ID
1 2015-06-26 12:59:00 365.0
2 2015-06-26 13:59:00 366.0
3 2015-06-27 00:01:00 366.1
4 2015-06-27 23:00:00 366.2
5 2015-06-28 00:01:00 366.3
6 2015-06-28 23:00:00 366.4
7 2015-06-29 09:00:00 367.0
8 2015-06-29 09:59:00 368.0
作为数据帧:
df <- structure(list(end = structure(c(1435323540, 1435327140, 1435363260,
1435446000, 1435449660, 1435532400, 1435568400, 1435571940), tzone = "UTC", class = c("POSIXct",
"POSIXt")), SNAP_ID = c(365, 366, NA, NA, NA, NA, 367, 368)), .Names = c("end",
"SNAP_ID"), row.names = c(NA, -8L), class = "data.frame")
这是我实现这个目标的尝试,但它只适用于第一个缺失的值:
df %>%
arrange(end) %>%
mutate(SNAP_ID=ifelse(is.na(SNAP_ID),lag(SNAP_ID)+0.1,SNAP_ID))
end SNAP_ID
1 2015-06-26 12:59:00 365.0
2 2015-06-26 13:59:00 366.0
3 2015-06-27 00:01:00 366.1
4 2015-06-27 23:00:00 NA
5 2015-06-28 00:01:00 NA
6 2015-06-28 23:00:00 NA
7 2015-06-29 09:00:00 367.0
8 2015-06-29 09:59:00 368.0
来自@mathetical的杰出答案。咖啡如下:
df %>%
arrange(end) %>%
group_by(tmp=cumsum(!is.na(SNAP_ID))) %>%
mutate(SNAP_ID=SNAP_ID[1] + 0.1*(0:(length(SNAP_ID)-1))) %>%
ungroup() %>%
select(-tmp)
编辑:新版本适用于任何数量的NA运行。这个也不需要动物园
。
首先,请注意 tmp=cumsum(!is.na(SNAP_ID))
将同一 tmp
的此类组SNAP_ID
分组,该组由一个非 NA 值后跟一系列 NA 值组成。
然后按此变量分组,只需在第一个SNAP_ID中添加.1即可填写NA:
df %>%
arrange(end) %>%
group_by(tmp=cumsum(!is.na(SNAP_ID))) %>%
mutate(SNAP_ID=SNAP_ID[1] + 0.1*(0:(length(SNAP_ID)-1)))
end SNAP_ID tmp
1 2015-06-26 12:59:00 365.0 1
2 2015-06-26 13:59:00 366.0 2
3 2015-06-27 00:01:00 366.1 2
4 2015-06-27 23:00:00 366.2 2
5 2015-06-28 00:01:00 366.3 2
6 2015-06-28 23:00:00 366.4 2
7 2015-06-29 09:00:00 367.0 3
8 2015-06-29 09:59:00 368.0 4
然后,您可以删除<code>tmp</code>列(添加<code>%
编辑:这是旧版本,不适用于NA
s的后续运行。
如果您的目标是用前一个值0.1填充每个NA,您可以使用zoo
的na.locf
(它用前一个值填充每个NA
),以及Cumsum(is.na(SNAP_ID))*0.1
来添加额外的0.1。
library(zoo)
df %>%
arrange(end) %>%
mutate(SNAP_ID=ifelse(is.na(SNAP_ID),
na.locf(SNAP_ID) + cumsum(is.na(SNAP_ID))*0.1,
SNAP_ID))
问题内容: 将 变长 列表的Python序列隐式转换为NumPy数组会导致该数组属于 object 类型。 尝试强制使用其他类型将导致异常: 通过使用给定的占位符填充“缺失”值来获取类型为int32的密集NumPy数组的最有效方法是什么? 从我的示例序列中,如果占位符为0,我想得到类似的结果 问题答案: 您可以使用itertools.zip_longest: 注意:对于Python 2,它是ite
欢迎提供任何关于这个问题更准确标题的帮助。。 我有一个数据框,其中包含客户级别的观察结果,记录日期以及客户在该日期消费的物品。看起来像这样。 此数据集中的每个观察值都与一个独特的存储日组合有关,但每个存储日观察值都是以消耗的物品的正数为条件列出的,即
问题内容: 这应该很简单,但是我发现的最接近的内容是这篇文章: pandas:填充组中的缺失值,但我仍然无法解决我的问题。 假设我有以下数据框 我想在每个“名称”组中用平均值填写,即 我不确定要去哪里: 问题答案: 一种方法是使用:
我正在制作一组自定义swing组件,这些组件实现各种属性,如标志或。我在尝试填充各种自定义组件的,然后根据每个组件的对列表进行排序时遇到问题。 我试图做到这一点的方法是让我的组件实现一个名为的接口,该接口实现一个方法。然后使用我的
问题内容: 我有一个包含2列的表格,日期和分数。它最多有30个条目,最近30天内每个条目一个。 我的问题是缺少某些日期-我想看看: 我从单个查询中需要得到的是:19,21,9,14,0,0,10,0,0,14 …这意味着缺失的日期填充有0。 我知道如何获取所有值,以及如何使用服务器端语言遍历日期和缺少空格。但这是否可以在mysql中完成,所以我可以按日期对结果进行排序并得到缺失的片段。 编辑:在此
我有一个单列PySpark数据框。 我想使用像熊猫ffill()函数一样的前向填充来计算缺失值。 期望输出 免责声明:我在stackoverflow中有一些解决方案,但当您只有一列作为输入时,它们就不起作用了。