Python 查找重复值包并分别对其执行操作

Python 查找重复值包并分别对其执行操作,python,pandas,numpy,Python,Pandas,Numpy,我有这种类型的熊猫系列 a = pd.Series([1, 4,3,5, 7,5, 5,6,7,6, 7, 6,2,2, 6, 9]) b = np.array([0, 1,1,1, 0,0, 1,1,1,1, 0, 1,1,1, 0, 1]) 和类型的numpy数组 a = pd.Series([1, 4,3,5, 7,5, 5,6,7,6, 7, 6,2,2, 6, 9]) b = np.array([0, 1

我有这种类型的熊猫系列

    a = pd.Series([1,  4,3,5,  7,5,  5,6,7,6,  7,  6,2,2,  6,  9])
    b = np.array([0,  1,1,1,  0,0,  1,1,1,1,  0,  1,1,1,  0,  1])
和类型的numpy数组

    a = pd.Series([1,  4,3,5,  7,5,  5,6,7,6,  7,  6,2,2,  6,  9])
    b = np.array([0,  1,1,1,  0,0,  1,1,1,1,  0,  1,1,1,  0,  1])
现在,我想分别生成
a
中元素的平均值,只要
b
的相应部分中有
1
的集群,结果是

    c = pd.Series([1,  4,4,4,  7,5,  6,6,6,6,  7,  3.3,3.3,3.3  6,  9])

有人知道如何很好地做到这一点吗?

尝试使用
shift+cumsum
,注意
6,2,2的平均值,
3.333..
不是5

s = pd.Series(b,index=a.index)
a.groupby(s.ne(s.shift()).cumsum()).transform('mean').where(s.eq(1),a)

方法#1

这里有一个简单的方法-

In [23]: ids = np.r_[0,b[:-1]!=b[1:]].cumsum()

In [24]: np.where(b==1,a.groupby(ids).transform('mean'),a)
Out[24]: 
array([1.        , 4.        , 4.        , 4.        , 7.        ,
       5.        , 6.        , 6.        , 6.        , 6.        ,
       7.        , 3.33333333, 3.33333333, 3.33333333, 6.        ,
       9.        ])
方法#2

对于性能,我们可以利用-


这不起作用,因为它会给出所有1和所有0的平均值是的,我可以确认它不起作用(只是尝试了一下)。如果我没有遗漏什么,那么
[6,2,2]
的平均值应该是
[3.3]