Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用多个值numpy/pandas对数组中的连续值进行计数_Python_Arrays_Pandas_Numpy - Fatal编程技术网

Python 使用多个值numpy/pandas对数组中的连续值进行计数

Python 使用多个值numpy/pandas对数组中的连续值进行计数,python,arrays,pandas,numpy,Python,Arrays,Pandas,Numpy,我检查了这个和其他的,但是技巧总是对真值或假值求和 我的案例如下: 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中是否有一种聪明的或已经内置的方法来实现这一点?输入数组arr的pandas方法应该是- In [55]: I

我检查了这个和其他的,但是技巧总是对真值或假值求和

我的案例如下:

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中是否有一种聪明的或已经内置的方法来实现这一点?

输入数组
arr
的pandas方法应该是-

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实现,根据间隔长度/大小创建范围--


您还可以使用
pd.Series
groupby

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]

您链接的解决方案需要进行非常小的修改才能为您的案例工作…@Chapo认为您需要编辑标题,以反映您想要创建一个远程阵列,而不仅仅是获得counts.thks以获得帮助-在这个问题上使用了一行one@Divakar,这会有帮助,如果您还可以演示如何在数据帧具有多列而不是一列pd.Series的情况下扩展解决方案。我无法计算“groupby”在这种情况下是如何工作的?一种方法(仍然是迭代的)是“pd.concat([s.groupby(pd.Grouper(I)).cumcount()代表s.columns中的I],axis=1,sort=False)”,其中“s=(s!=s.shift()).cumsum()”来自上面的@Henry Yik一行
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]