【问题标题】:Count consecutive values within an array with multiple values numpy/pandas计算具有多个值的数组中的连续值 numpy/pandas
【发布时间】:2020-03-07 21:37:53
【问题描述】:

我在 SO 上检查了这个 question 和其他人,但诀窍总是对 True 或 False 值求和。

我的情况是以下数组:

arr = [1,2,3,3,4,5,6,1,1,1,5,5,8,8,8,9,4,4,4]

我想为数组的每个成员获取重复值的“当前”条纹的长度。

对于上面的例子,我想得到:

res = [1,1,1,2,1,1,1,1,2,3,1,2,1,2,3,1,1,2,3]

我可以编写一个愚蠢的循环,但是在 numpy/pandas 中是否有一种聪明的或已经内置的方法来做到这一点?

【问题讨论】:

  • 需要对您链接的解决方案进行非常小的修改以适用于您的情况...
  • @Chapo 认为您需要编辑标题以反映您想要创建一个 ranged-array,而不仅仅是获取计数。

标签: python arrays pandas numpy


【解决方案1】:

输入数组arr 的熊猫方式是 -

In [55]: I = np.r_[False,arr[:-1]!=arr[1:]].cumsum()

In [56]: df = pd.DataFrame({'ids':I,'val':np.ones(len(arr),dtype=int)})

In [57]: df.groupby('ids')[['val']].cumsum().values.ravel()
Out[57]: array([1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 2, 1, 2, 3, 1, 1, 2, 3])

另一个使用自定义 NumPy 实现基于间隔长度/大小创建范围 - intervaled_ranges -

In [91]: m = np.r_[True,arr[:-1]!=arr[1:],True]

In [92]: intervaled_ranges(np.diff(np.flatnonzero(m)),start=1)
Out[92]: array([1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 2, 1, 2, 3, 1, 1, 2, 3])

【讨论】:

  • 感谢您的帮助 - 在这个上使用单线
  • @Divakar,如果您还可以展示在具有多列而不是一列 pd.Series 的 Dataframe 的情况下如何扩展解决方案,这将很有帮助。我不知道在这种情况下“groupby”是如何工作的?
  • 一种方法(仍然是迭代的)是“pd.concat([s.groupby(pd.Grouper(i)).cumcount() for i in s.columns],axis=1, sort=False)",其中 "s = (s!=s.shift()).cumsum()" 来自@Henry Yik 上面一行
【解决方案2】:

你也可以使用pd.Seriesgroupby

s = pd.Series([1,2,3,3,4,5,6,1,1,1,5,5,8,8,8,9,4,4,4])

print (s.groupby((s!=s.shift()).cumsum()).cumcount() + 1)
#
[1, 1, 1, 2, 1, 1, 1, 1, 2, 3, 1, 2, 1, 2, 3, 1, 1, 2, 3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 2021-11-07
    • 2014-08-12
    • 2014-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多