回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我想知道一行的值连续达到max的次数。你知道吗</p>
<ul>
<li><p>Ps1:我的数据有500K行,所以我担心计算速度</p></li>
<li><p>Ps2:在本例中,startDay=1,endDay=7,但有些行
不同的开始或结束日期。(例如startDay=2,endDay=5或
开始日期=4,结束日期=3。arr\u bool control this conditions)</p></li>
</ul>
<p>我的数据:</p>
<pre class="lang-py prettyprint-override"><code>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
</code></pre>
<p>我应该搜索每一行的时间间隔
我可以找到时间间隔中的最大值,但找不到连续命中最大值的行的值计数。你知道吗</p>
<pre class="lang-py prettyprint-override"><code>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'])
</code></pre>
<p>最后条件:</p>
<pre class="lang-py prettyprint-override"><code>df_result.result= np.select( condlist = [startday.start > endday.end,
~arr_bool.any(axis=1)],
choicelist = [Neg99,Neg90],
default = df_result.result)
</code></pre>
<p>我想要的结果</p>
<pre class="lang-py prettyprint-override"><code>result_i_want = pd.DataFrame([2,1,3,6,1,3,0,3,1,2],columns=['result'], index=idx)
</code></pre>
<p>这是@WeNYoBen的解决方案,但进展缓慢</p>
<pre class="lang-py prettyprint-override"><code>s=((df.eq(df.max(1),0))&(df.ne(0)))
s.apply(lambda x : x[x].groupby((~x).cumsum()).count().max(),1).fillna(0)
</code></pre>