【问题标题】:Count Total number of sequences that meet condition, without for-loopCount 满足条件的序列总数,没有for循环
【发布时间】:2018-03-25 10:36:13
【问题描述】:

我有以下数据框作为输入:

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。

  • 第一个序列 = [555]
  • 第二序列 = [44655]
  • 第三序列 = [5]

有没有办法在 pandas 中不使用 for 循环来计算这个? 我已经使用 for-loop 实现了一个解决方案,我想知道在 O(N) 时间内使用 pandas 是否有更好的方法。

非常感谢!

与本题相关:How to count the number of time intervals that meet a boolean condition within a pandas dataframe?

【问题讨论】:

  • 为什么不能使用 for 循环?对于这类问题,它可能是最快、最易读的解决方案。
  • 是的,这是个好问题。我完全同意,我已经在 O(N) 时间内使用 for 循环实现了一个解决方案,但我想知道是否有更好的方法使用 pandas。
  • 啊,那么您可能想在问题正文中澄清这一点,因为回答问题的人可能会偏离您的目标。
  • 谢谢,我刚刚编辑了问题,希望问题现在表述得更清楚。

标签: python pandas


【解决方案1】:

你可以使用:

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

【讨论】:

  • 非常感谢您的回答
【解决方案2】:

如果您不需要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]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多