python - 计算 pandas df 的滚动窗口内的重复行

标签 python pandas

我有一个大型 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/

相关文章:

python - 奇怪的 Django AuthenticationForm 行为

python:读取文件并将其拆分为字典列表

python - 谷歌应用程序引擎的顶级用户身份验证方法

python - 如何仅为列中的特定值生成虚拟变量?

python - 循环遍历 pandas 数据框,将公式应用于每个值

python - 使用附加列识别重复的行

python - 如何在 X-Y 平面上绘制标签之间的欧氏距离

python - 强制从另一个模块中的函数导入

python - 迭代数据框并检查日期

python - 如何将两列值转换为键值对字典?