我有一个大型 pd.DataFrame,其中包含混合的 str/float 列。我想在一行的(居中)20 分钟窗口内计算该行的重复项数。
例如:
time = [3,4,5,6,10,15,25,27,50]
a = np.ones(len(time))
b = np.zeros(len(time))
c = ['a', 'a', 'b', 'b', 'b', 'c', 'd','d','d']
df = pd.DataFrame({'time':time, 'a':a, 'b':b, 'c':c})
我期望的结果是:
result = [1,1,2,2,2,0,1,1,0]
如您所见,结果的长度与时间相同,并且它计算该行两侧 10“分钟”内的重复项数。例如,时间 = 27 的行只有一个重复项,因为虽然时间 = 50 的行是重复项,但它在时间上相距太远,无法考虑。
获得结果的一种非常缓慢且丑陋的方法是使用 for 循环并手动创建一个移动的窗口:
result = []
for i, t in zip(df.index, df.time):
x = df[(df['time']>t-10) & (df['time']<t+10)]
row = df.loc[i,['a','b','c']]
res = ((x==row).sum(axis=1)==3).sum()-1
result.append(res)
我需要更快的实现,并查看了 pandas 数据帧的 .rolling
方法,但无法让它处理多个列和 str 值。
最佳答案
我只能想办法加快进程
s=pd.Series(df.drop('time',1).apply(tuple,1).map(hash).values,index=df.time)
[ sum(s.loc[x-10:x+10]==y)-1 for x ,y in zip(s.index,s)]
Out[1008]: [1, 1, 2, 2, 2, 0, 1, 1, 0]
关于python - 计算 pandas df 的滚动窗口内的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57101482/