- 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/
这很可能是我的语法错误,因为我对在 C++ 中使用多个文件和结构(特别是将结构传递给函数)还很陌生。这是三个文件: 主要.cpp: #include #include #include #inc
我有 TypeScript NestJS 项目。 我需要验证传入的 DTO 到我的 API。它可以被描述为“创建项目”,其中我们有建筑类型(房屋、公寓、花园),并根据该类型我们需要定义: 房屋:楼层包
是否可以从可用于泛型参数的可能类型集中排除特定类型?如果是如何。 例如 Foo() : where T != bool 将意味着除了类型 bool 之外的任何类型。 编辑 为什么? 以下代码是我尝试强
我的 WebGL 体积光线转换应用程序即将完成。但是我发现了一个问题。我必须通过 2D 纹理模拟 3D 纹理。这不是问题。我正在用小切片创建一个巨大的纹理。巨大纹理的尺寸约为 4096x4096 像素
我正在处理的网页上显示了一个返回顶部按钮。当您向下滚动时,有时单击它时,它会跳到顶部,然后跳回您在页面上的位置,然后像预期的那样平滑滚动到顶部。请记住,它并不总是这样做。这只是一个滞后或故障问题还是我
我对此还很陌生,所以请耐心等待。 我有一个类,它具有三个属性:几个整数和一个用户定义对象的集合。 public class Response { public int num1 { get;
我正在制作一款平台游戏,让玩家每 30 毫秒跳跃一次,并向上添加少量的力。我想我应该使用多线程,因为我之前已经做过一些,而且看起来很简单。无论如何,我尝试了这个: public void jump()
是否可以从可能的类型集中排除特定类型,这些类型可以在泛型参数中使用?如果是这样的话。 例如 Foo() : where T != bool 表示除 bool 类型之外的任何类型。 编辑 为什么? 以下
我正在尝试在单个查询中实现内部和外部联接,我不确定我的做法是正确还是错误,因为我不太擅长查询。 就这样吧。 我有以下表格。 hrs_residentials hrs_residential_utili
关于 my website ,有一段代码可以向页面添加几个元素。这段代码不是我可以编辑的东西,而且我对它放置这些元素的位置不满意,因为它弄乱了我的一些布局。所以我想出了一个小的 jQuery 来将它们
一位客户希望我创建一个数据集,如下所示。我不知道这是否可能或合乎逻辑。 我有表parent: id name ------- ------- 1 parent1 2
这可能吗?google 好像没有这方面的资料.. 这样,如果用户在另一个网站上播放视频或歌曲,我的音量就会自动减小 最佳答案 不,这是不可能的。 如果可能的话,它必须是特定于浏览器的,但我不认为这种情
所以我正在尝试制作响应式页面。问题是为什么它归结为移动数据需要位于列表中。 我会用一些示例代码来解释 所以这可能是桌面上的输出 option1
当您将鼠标悬停在a 元素 上时,是否可以删除url? 这就是我的意思: 最佳答案 一种选择是使用一些 JavaScript。 删除 href=来自 的属性标签,取而代之的是 onclick=...
我已经考虑了几个小时,但我无法取得太大进展。它是这样的: You have an array of size n and q queries. Each query is of the form (l
我一直在尝试编写一个脚本来强化 android。我没有成功! 我正在通过模拟器运行一个 AVD,并且已经用我加载的 android shell 和 bash shell 试过了。正如您将在下面看到的那
Private Sub Workbook_Open() Dim WBname As String WBname = ThisWorkbook.name If Not InStr(WBname, "te
Spark 2.0.0-预览版 我们有一个应用程序使用了相当大的广播变量。我们在大型 EC2 实例上运行它,因此部署处于客户端模式。广播变量是一个巨大的 Map[String, Array[Strin
我正在尝试从此link中提取摘要。但是,我无法仅提取摘要的内容。到目前为止,这是我完成的工作: url <- "http://www.scielo.br/scielo.php?script=sci_a
我的主页中有一个iframe。 iframe页面中有一个modalpopup。因此,当显示modalpopup时,modalpopup的父级是iframe主体和主页父级主体。因此,覆盖层仅覆盖ifra
我是一名优秀的程序员,十分优秀!