我有以下Dataframe作为输入:
l = [2,2,2,5,5,5,3,3,2,2,4,4,6,5,5,3,5]
df = pd.DataFrame(l)
print(df)
0
0 2
1 2
2 2
3 5
4 5
5 5
6 3
7 3
8 2
9 2
10 4
11 4
12 6
13 5
14 5
15 3
16 5
作为输出,我希望最终计算满足特定条件的总序列。例如,在这种情况下,我想要值大于3的序列数。 所以,输出是3。
有没有办法在pandas中没有for循环的情况下计算出来? 我已经使用for-loop实现了一个解决方案,我想知道在O(N)时间内是否有更好的方法使用pandas。
非常感谢!
与此问题相关:How to count the number of time intervals that meet a boolean condition within a pandas dataframe?
答案 0 :(得分:2)
您可以使用:
m = df[0] > 3
df[1] = (~m).cumsum()
df = df[m]
print (df)
0 1
3 5 3
4 5 3
5 5 3
10 4 7
11 4 7
12 6 7
13 5 7
14 5 7
16 5 8
#create tuples
df = df.groupby(1)[0].apply(tuple).value_counts()
print (df)
(5, 5, 5) 1
(4, 4, 6, 5, 5) 1
(5,) 1
Name: 0, dtype: int64
#alternativly create strings
df = df.astype(str).groupby(1)[0].apply(''.join).value_counts()
print (df)
5 1
44655 1
555 1
Name: 0, dtype: int64
如果需要输出列表:
print (df.astype(str).groupby(1)[0].apply(''.join).tolist())
['555', '44655', '5']
详情:
print (df.astype(str).groupby(1)[0].apply(''.join))
3 555
7 44655
8 5
Name: 0, dtype: object
答案 1 :(得分:0)
如果您不需要pandas
,这将满足您的需求:
l = [2,2,2,5,5,5,3,3,2,2,4,4,6,5,5,3,5]
def consecutive(array, value):
result = []
sub = []
for item in array:
if item > value:
sub.append(item)
else:
if sub:
result.append(sub)
sub = []
if sub:
result.append(sub)
return result
print(consecutive(l,3))
#[[5, 5, 5], [4, 4, 6, 5, 5], [5]]