我有这样的DataFrame:
RTD Val
BA 2
BA 88
BA 15
BA 67
BA 83
BA 77
BA 79
BA 90
BA 1
BA 14
第一:
df['count'] = df.Val > 15
print(df)
我得到了结果:
RTD Val count
0 BA 2 False
1 BA 88 True
2 BA 15 False
3 BA 67 True
4 BA 83 True
5 BA 77 True
6 BA 79 True
7 BA 90 True
8 BA 1 False
9 BA 14 False
现在,要计算我使用的最大连续次数:
def rolling_count(val):
if val == rolling_count.previous:
rolling_count.count +=1
else:
rolling_count.previous = val
rolling_count.count = 1
return rolling_count.count
rolling_count.count = 0 #static variable
rolling_count.previous = None #static variable
ddf= df['count'].apply(rolling_count)
print (max(ddf))
我得到结果:5
。
我的回答是: 要计算连续出现的最大值False,我该怎么做?
正确的值等于2
。
我有兴趣知道Val > 15
以外的连续出现次数的最大值,反之亦然
答案 0 :(得分:2)
这是一个更长的方法,通过加0来强制count为整数而不是boolean。绝对差异表示布尔值的变化,第一个值填充为1.
此更改的结果系列评估了元素是否在' bools'中大于0。变量和来自df [' count']的相应元素被提取。
更改向量的结果与cumsum
一起使用以形成在运行变量中groupby
中使用的ID。然后在运行变量中对每个ID的计数进行计算。
countDf = DataFrame({'bools': list(df['count'][(df['count'] + 0)
.diff().abs().fillna(1) > 0]),
'runs': list(df['Val'].groupby((df['count'] + 0)
.diff().abs().fillna(1).cumsum()).count())})
countDf
bools runs
0 False 1
1 True 1
2 False 1
3 True 5
4 False 2
您可以使用标准子集(如
)提取最大运行次数countDf[countDf.bools == False]['runs'].max()
2
countDf[countDf.bools == True]['runs'].max()
5
答案 1 :(得分:1)
这是我的尝试
gt15 = df.Val.gt(15)
counts = df.groupby([gt15, (gt15 != gt15.shift()) \
.cumsum()]).size().rename_axis(['>15', 'grp'])
counts
>15 grp
False 1 1
3 1
5 2
True 2 1
4 5
dtype: int64
counts.loc[False].max()
2