- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有一个这样的数据框:
ID 0 1 2 3 4 5 6 7 8 ... 81 82 83 84 85 86 87 88 89 90 total day_90
-------------------------------------------------------------------------------------------------------------
0 A 2 21 0 18 3 0 0 0 2 ... 0 0 0 0 0 0 0 0 0 0 156 47
1 B 0 20 12 2 0 8 14 23 0 ... 0 0 0 0 0 0 0 0 0 0 231 35
2 C 0 38 19 3 1 3 3 7 1 ... 0 0 0 0 0 0 0 0 0 0 78 16
3 D 3 0 0 1 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0 5 3
其中最后一列 [day_90] 包含哪一列 ([0] - [90]) 累积每行 [total] 的 90% 的值。澄清一下,以第一行为例:在第47列中,ID A总共命中了他将在90天内完成的156个事件中的90%。
我需要的是:对于每一行,计算大于 7(或任何预定义的任意数字)的第一个 0 序列的长度。因此,例如:对于第一行,我想知道第 47 列之后的第一个零序列有多长,但前提是该序列连续超过 7 个零。如果有 6 个零,然后有一个非零,那我就不想数了。
最后,我想将此结果存储在 [day_90] 之后的新列中。因此,如果 ID A 在第 47 列之后有一个由 10 个零组成的序列,我想添加一个新列 [0_sequence] 来保存该 ID 的值 10。
我真的不知道从哪里开始。感谢任何帮助 =)
最佳答案
您的问题基本上是孤岛和缺口问题的变体:非零会创建一个新的“孤岛”,而 0 会扩展当前的孤岛。并且您想找到第一个具有一定大小的岛屿。在我回答您的问题之前,让我向您介绍一下该问题的缩小版本。
假设您有一个系列:
>>> a = pd.Series([0,0,0,13,0,0,4,12,0,0])
0 0
1 0
2 0
3 13
4 0
5 0
6 4
7 12
8 0
9 0
并且您想找到长度至少为 3 个元素的第一个 0 序列的长度。让我们首先将它们分配到“孤岛”中:
# Every time the number is non-zero, a new "island" is created
>>> b = (a != 0).cumsum()
0 0 <-- island 0
1 0
2 0
3 1 <-- island 1
4 1
5 1
6 2 <-- island 2
7 3 <-- island 3
8 3
9 3
对于每个岛屿,我们只对等于 0 的元素感兴趣:
>>> c = b[a == 0]
0 0
1 0
2 0
4 1
5 1
8 3
9 3
现在让我们确定每个岛的大小:
>>> d = c.groupby(c).count()
0 3 <-- island 0 is of size 3
1 2 <-- island 1 is of size 2
3 2 <-- island 3 is of size 2
dtype: int64
并过滤大小 >= 3 的岛屿:
>>> e = d[d >= 3]
0 3
如果 e
不为空,则答案是 e
的第一个元素(岛 0,大小 3)。否则,没有岛屿符合我们的标准。
并将其应用于您的问题:
def count_sequence_length(row, n):
"""Return of the length of the first sequence of 0
after the column in `day_90` whose length is >= n
"""
if row['day_90'] + n > 90:
return 0
# The columns after `day_90`
idx = np.arange(row['day_90']+1, 91)
a = row[idx]
b = (a != 0).cumsum()
c = b[a == 0]
d = c.groupby(c).count()
e = d[d >= n]
return 0 if len(e) == 0 else e.iloc[0]
df['0_sequence'] = df.apply(count_sequence_length, n=7, axis=1)
上面的版本很好,但是很慢,因为它计算了所有岛屿的大小。由于您只关心第一个满足标准的岛屿的大小,因此一个简单的 for
循环工作得更快:
def count_sequence_length_2(row, n):
if row['day_90'] + n > 90:
return 0
size = 0
for i in range(row['day_90']+1, 91):
if row[i] == 0:
# increase the size of the current island
size += 1
elif size >= n:
# found the island we want. Search no more
break
else:
# create a new island
size = 0
return size if size >= n else 0
df['0_sequence'] = df.apply(count_sequence_length_2, n=7, axis=1)
当我对其进行基准测试时,这实现了 10 到 20 倍的速度提升。
关于python - Pandas 数据帧中特定列后给定大小的第一个零序列的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59581340/
我正在阅读 Python 文档以真正深入了解 Python 语言,并遇到了 filter 和 map 函数。我以前使用过过滤器,但从未使用过映射,尽管我在 SO 上的各种 Python 问题中都见过这
当我尝试打印 BST 的级别顺序时,这个问题提示了我。 这是一个 Pre-Order Sequence: 4, 1, 2, 3, 5, 6, 7, 8 In_order Sequence : 1, 2
我的代码在 main(序列测试;)的第一行出现错误,指出它是对 sequence::sequence() 的 undefined reference 。我无法更改 main 中的代码。有谁知道我该如何
这可能很简单,但我在通常的 latex 指南中找不到任何相关内容。在这句话中: {\em hello\/} “\/”的目的是什么? 最佳答案 这就是所谓的斜体校正。其目的是确保斜体文本后有适当的间距。
当我从 Postgresql 表中删除所有记录,然后尝试重置序列以在插入时开始一个编号为 1 的新记录时,我得到不同的结果: SELECT setval('tblname_id_seq', (SELE
在版本10.0.3中,MariaDB引入了一种称为序列的存储引擎。 其ad hoc为操作生成整数序列,然后终止。 该序列包含正整数,以降序或升序排列,并使用起始,结束和递增值。 它不允许在多个查询中
如何在 Groovy 中获取给定数字的序列,例如: def number = 169 // need a method in groovy to find the consecutive number
基本上,如果这是 .NET,它看起来像这样: ISomething { string A { get; } int B { get; } } var somethings = new List
说以下代码部分(同一块): A <= 1 A <= 2 变量 A 总是被赋值为 2 吗?还是会出现竞争条件并分配 1 或 2? 我对非阻塞赋值的理解是,由硬件在 future 分配变量 A,因此它可能
在运行 WiX 设置时,我正在寻找操作列表及其顺序。不知何故,官方网站似乎没有提供任何信息。 基本问题是我想正确安排我的自定义操作。通常我需要使用 regsvr32.exe 注册一个 DLL,而这只能
F#初学者在这里 我想创建一个类型,它是具有至少一个元素的另一种具体类型(事件)的序列。任何其他元素都可以在以后随时添加。通常在 C# 中,我会创建一个具有私有(private) List 和公共(p
作为构建过程和不断发展的数据库的一部分,我试图创建一个脚本,该脚本将删除用户的所有表和序列。我不想重新创建用户,因为这将需要比所允许的更多的权限。 我的脚本创建了一个过程来删除表/序列,执行该过程,然
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
这个问题已经有答案了: sql ORDER BY multiple values in specific order? (12 个回答) 已关闭 9 年前。 我有一个 sql 语句,我想要ORDER
我想恢复两个向量的第一个日期和相同向量的第二个日期之间的日期序列,.... 这是一个例子: dates1 = as.Date(c('2015-10-01', '2015-03-27', '2015-0
在用java编写代码时,我需要用“],[”分割字符串。下面是我的代码。 try (BufferedReader reader = new BufferedReader(new InputStreamR
这个问题已经有答案了: Project Euler Question 14 (Collatz Problem) (8 个回答) 已关闭 9 年前。 我正在尝试查找数字的 Collatz 序列。以下
我有一个例程函数process_letter_location(const char& c, string &word)。 在我的 main 中,我声明了一系列字符串变量,如下所示: string s
我需要找到最长的多米诺骨牌链,给定一组 12 个随机挑选的多米诺骨牌。我已经递归地生成了多米诺骨牌的所有可能性(使用 0 到 12 的面值有 91 种可能性)。多米诺骨牌由一 block “砖 blo
我有这个数据结构 Seq,它继承了类 vector 但有一些额外的功能。使用这个数据结构 Seq 我有这个预定义的数据结构: typedef Seq > MxInt2d; 我现在想要一个包含多个 Mx
我是一名优秀的程序员,十分优秀!