- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有 id
和 date
的 DataFrame
。我想创建另一个 DataFrame
,它列出 id
是否存在于给定的月份,超过预定义的时间段(比如 2018 年全年)。此外,如果有任何 2 个月或更短的存在差距,我想填补它们。
我想我会包括第一部分,因为从一开始就有更好的解决方案。这是开始的 df
import pandas as pd
import numpy as np
df = pd.DataFrame({'id': [1,1,1,1,1,2,2,2,3],
'date': ['2018-02-01', '2018-03-12', '2018-05-10',
'2018-10-10', '2018-11-04', '2018-06-07', '2018-07-07',
'2018-09-16', '2018-02-02']})
df['date'] = pd.to_datetime(df.date)
为了让它存在 df_exist
我创建了一个新列 id_exists
并与平铺时间段合并 df_per
df['id_exists'] = True
per = pd.date_range('2018-01-01', '2018-12-31', freq='MS')
df_per = pd.DataFrame({'id': np.tile(df.id.unique(), len(per)),
'Period': np.repeat(per,df.id.nunique())})
df_exist = df_per.merge(df, left_on=['id', df_per.Period.dt.year, df_per.Period.dt.month],
right_on=['id', df.date.dt.year, df.date.dt.month], how='left').drop(columns='date').fillna(False)
# Period id id_exists
#0 2018-01-01 1 False
#1 2018-01-01 2 False
#2 2018-01-01 3 False
#3 2018-02-01 1 True
#4 2018-02-01 2 False
我决定用 False
来 fillna
因为这允许我使用下面的函数和 cumsum
,但当然如果有使用 NaN
的解决方案也一样好。
现在我已经定义了一个函数,它似乎可以做我想做的事情:索引比较确保我不会在任何一边填充东西,而与 gap_size 的比较确保我只填充小的空白。 if-else 确保它正常工作,无论第一个条目在存在 df
中是 True 还是 False。
def FillGaps(df, gap_size):
gb = df.groupby(df.id_exists.cumsum()).size()
if df.id_exists.values[0] == False:
to_fill = gb[(gb.index > gb.index.min()) & (gb.index < gb.index.max()) &
(gb.values <= gap_size)].index.values
else:
to_fill = gb[(gb.index < gb.index.max()) & (gb.values <= gap_size)].index.values
df.loc[df.id_exists.cumsum().isin(to_fill), 'id_exists'] = True
return df
df_exist = df_exist.groupby('id').apply(lambda df: FillGaps(df, gap_size=2))
但是,它在大型 DataFrame
上非常慢。关于如何使它更快的任何想法?它看起来不像任何内置的 fillna
方法都适用于这种类型的填补空白的情况,可能存在多个空白。
这是预期的输出。 (我做了一些合并,所以它没有格式化为一个烦人的长表)。关键是没有任何边缘受到干扰,只有 2 个月或更短的间隙被填充并且 id==3
没有失败,其中只有一个值开始。
Period id_1 id_exists_1 id_2 id_exists_2 id id_exists
0 2018-01-01 1 False 2 False 3 False
1 2018-02-01 1 True 2 False 3 True
2 2018-03-01 1 True 2 False 3 False
3 2018-04-01 1 True 2 False 3 False
4 2018-05-01 1 True 2 False 3 False
5 2018-06-01 1 False 2 True 3 False
6 2018-07-01 1 False 2 True 3 False
7 2018-08-01 1 False 2 True 3 False
8 2018-09-01 1 False 2 True 3 False
9 2018-10-01 1 True 2 False 3 False
10 2018-11-01 1 True 2 False 3 False
11 2018-12-01 1 False 2 False 3 False
最佳答案
这是一种实现方式:
month = df.date - pd.Timedelta('1 day') * (df.date.dt.day - 1)
df_exist = df.id.astype(str).str.get_dummies().groupby(month).sum() != 0
def fill_gaps(arr):
notnan, = (~np.isnan(arr)).nonzero()
return np.nan if not notnan.size else arr[notnan[-1]]
date_range = pd.date_range('2018-01-01', '2018-12-31', freq='MS')
rolling = df_exist.reindex(date_range).rolling(window=2, min_periods=1)
result = rolling.apply(fill_gaps).fillna(False).astype(bool)
result[date_range > month.max()] = False
第一部分应该比手动连接快得多。第二部分对数据帧使用滚动 API。
输出看起来像这样:
1 2 3
2018-01-01 False False False
2018-02-01 True False True
2018-03-01 True False False
2018-04-01 True False False
2018-05-01 True False False
2018-06-01 False True False
2018-07-01 False True False
2018-08-01 False True False
2018-09-01 False True False
2018-10-01 True False False
2018-11-01 True False False
2018-12-01 False False False
这似乎与您示例中的结果相匹配。
关于python - 是否有一种快速的方法来填充间隙(可能是多个)之间的 NA 值,并且仅当间隙小于一定大小时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49823073/
在 R Language Definition 中,对NA值进行了简要描述,其中一部分说 ... In particular, FALSE & NA is FALSE, TRUE | NA is TR
我对 R 还很陌生,目前遇到一个问题,数据如下所示: ID h1 h2 h3 h4 h5 h6 h7 h8
我有一个 csv包含国家名称及其 ISO 代码的文件。这是它的样子: "Name","Code" "Afghanistan","AF" "Albania","AL" "Algeria","DZ" "N
我想用 dplyr 解决以下问题。最好与窗口功能之一一起使用。我有一个包含房屋和购买价格的数据框。下面是一个例子: houseID year price 1 19
在data.frame(或data.table)中,我想用最接近的先前非NA值“向前填充”NA。一个使用向量(而不是 data.frame)的简单示例如下: > y yy [1] NA NA NA
这是一个示例数据框: > df = data.frame(rep(seq(0, 120, length.out=6), times = 2), c(sample(1:50, 4), + NA, NA,
我有一个包含条目的数据框;似乎这些值不被视为 NA,因为 is.na 返回 FALSE。我想将这些值转换为 NA 但找不到方法。 最佳答案 使用 dfr[dfr==""]=NA哪里dfr是你的数据框。
我有一个示例表,其中包含一些但不是全部 NA需要替换的值。 > dat id message index 1 1 1 2 1 foo 2 3 1
在 R 中,如果从 NA 中减去一个数字,它将返回 NA: > x NA - x [1] NA 但是如果你尝试从 NA 中减去一个日期,它会返回一个错误: > x NA - x Error in
这个问题在这里已经有了答案: Logical operators (AND, OR) with NA, TRUE and FALSE (2 个答案) 关闭 4 年前。 为什么在 R 中会这样? >
我有一个看起来像这样的数据框: SampleNo Lab1 Lab2 Lab3 lab4 lab5 lab6 lab7 lab8 lab9 lab10 1 59
我有一个按“id”分组的数据框和一个包含缺失值的变量“age”,NA。 在每个“id”中,我想替换“age”的缺失值,但只“填充”之前 第一个 非NA 值。 data % group_by(id) %
我有如下所示的数据框: df df id value v1 v2 v3 1 1 351 NA 1 0 2 2 585 0 1 1 3 3 321 NA 0 1 4
所以我有一个数据集,只需查看它,数据集中就有明显的 NA。 > dput(bmi.cig) structure(list(MSI.subset.BMI = structure(c(4L, 4L, 4
我有两个 30m x 30m 的光栅文件,我想从中采样点。在采样之前,我想从图像中移除模糊区域。我求助于 R 和 Hijman 的 Raster 包来完成这项任务。 使用 drawPoly(sp=TR
我有以下时间序列 > y y[c(1,2,5,9,10)] y [,1] 2011-09-04 NA 2011-09-05 NA 2011-09-06 3 201
这个问题在这里已经有了答案: Replace missing values (NA) with most recent non-NA by group (7 个回答) 5年前关闭。 我有一个 DF 个
我想向我的数据框中添加一个新变量 (N_notNAs),它定义了其他任何变量是否为 NA。 x y z N_notNAs 2 3 NA NA NA 1 3 NA 2
我有一个名为 SMOKE 的因子,级别为“Y”和“N”。缺失值被替换为 NA(从初始级别“NULL”开始)。然而,当我查看这个因素时,我得到这样的结果: head(SMOKE) # N N Y Y
假设我有以下 data.frame: t<-c(1,1,2,4,5,4) u<-c(1,3,4,5,4,2) v<-c(2,3,4,5,NA,2) w<-c(NA,3,4,5,2,3) x<-c(2,
我是一名优秀的程序员,十分优秀!