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]