我想知道一行的值连续达到max的次数。你知道吗
Ps1:我的数据有500K行,所以我担心计算速度
Ps2:在本例中,startDay=1,endDay=7,但有些行 不同的开始或结束日期。(例如startDay=2,endDay=5或 开始日期=4,结束日期=3。arr\u bool control this conditions)
我的数据:
import pandas as pd
import numpy as np
idx = ['id1', 'id2', 'id3', 'id4', 'id5',
'id6', 'id7', 'id8', 'id9', 'id10']
data = {'Day1':[0,0,1,0,1,1,0,0,1,1],
'Day2':[0,1,1,1,2,1,0,1,1,2],
'Day3':[1,3,1,1,1,0,0,1,3,2],
'Day4':[1,2,0,1,1,0,0,2,1,1],
'Day5':[0,2,1,1,1,1,0,2,1,1],
'Day6':[1,0,1,1,2,1,0,2,1,1],
'Day7':[0,0,0,1,1,1,0,0,3,1]}
startday = pd.DataFrame([1,1,1,1,1,1,1,1,1,1],columns=['start'], index=idx)
endday = pd.DataFrame([7,7,7,7,7,7,7,7,7,7],columns=['end'], index=idx)
df = pd.DataFrame(data, index=idx)
Neg99 = -999
Neg90 = -900
我应该搜索每一行的时间间隔 我可以找到时间间隔中的最大值,但找不到连续命中最大值的行的值计数。你知道吗
arr_bool = (np.less_equal.outer(startday.start, range(1,8))
& np.greater_equal.outer(endday.end, range(1,8))
)
df_result = pd.DataFrame(df.mask(~arr_bool).max(axis=1),
index=idx, columns=['result'])
最后条件:
df_result.result= np.select( condlist = [startday.start > endday.end,
~arr_bool.any(axis=1)],
choicelist = [Neg99,Neg90],
default = df_result.result)
我想要的结果
result_i_want = pd.DataFrame([2,1,3,6,1,3,0,3,1,2],columns=['result'], index=idx)
这是@WeNYoBen的解决方案,但进展缓慢
s=((df.eq(df.max(1),0))&(df.ne(0)))
s.apply(lambda x : x[x].groupby((~x).cumsum()).count().max(),1).fillna(0)
尝试以下解决方案:
从定义要应用于每行的函数开始:
itertools.groupby
(上面使用)和pd.groupby
是itertools版本启动了一个新组 在源值的每个更改上,因此每个组包含一个序列 具有相同的值(来自当前行)。你知道吗第一步是获取当前行的适当切片。你知道吗
sd
是起始索引(包括)ed
是结束索引(不包括)rr
是正确的片(进一步称为行)。你知道吗如果当前行中的最大值为>;0,则列表将显示 以上使用:
函数返回的值是此列表中的最大值, i、 e.最大值的最长序列的长度。你知道吗
如果当前行仅包含零(max==0),则返回0。你知道吗
然后,唯一要做的就是将上述函数应用于每一行:
当然,您必须导入itertools。你知道吗
与其他答案相比,我的解决方案的优点是 明显更短。你知道吗
下面是另一个
numpy
解决方案。首先,将计时与@pirsquares进行比较,以供参考。在给出完全相同的结果的同时,我的代码在一个大型示例中的速度提高了约14倍。你知道吗代码:
纯粹的裸体切片之类的
这一努力的重点是OP要求速度。这应该会有帮助。如果您有权访问像
numba
这样的JIT库,那么应该使用它并在每一行上循环。你知道吗说明
我不谈显而易见的事情。你知道吗
这表示每个间隔中的天数
i
是j
中对应的展平列索引的展平相关行索引mx
将是每个间隔的最大值。你知道吗b
将是一个布尔数组,其宽度比v
宽2列。在这种情况下,它看起来像:使用缓冲列的原因是我可以在使用
np.where
之后计算位置的差异现在我填充
b
,其中v
值不等于mx
中的最大值然后我找到这些位置在
y
中的位置。你知道吗通过使用
diff
,我找到了从一个不等于max的实例到下一个不等于max的实例的位置数。这总是比我们要查找的数字大一个,但我们稍后会更正它。你知道吗另外,
diff
会将长度减少1,但实际上,有很多东西我们不需要,因为我不需要计算一行相对于前一行的差值。幸运的是,我可以消除所有零或负的差异,因为它们没有意义。你知道吗我再次使用了
np.maximum.at
,但是这次是在差异上找到最大的差异,这将是每行连续最大值的最长长度。你知道吗请注意,实际上还有一个
呸。我厌倦了打字。。。你知道吗
相关问题 更多 >
编程相关推荐