使用当前行作为条件的熊猫累积总和

时间:2014-07-14 20:59:45

标签: python pandas

我有一个相当大的数据集,大约有200万条记录,每条记录都有一个开始时间和一个结束时间。我想在每个记录中插入一个字段,该字段计算表格中有多少条记录:

  • 开始时间小于或等于"此行"的开始时间
  • AND结束时间大于"此行"的开始时间

因此,基本上每条记录最终都会计算出包括其本身在内的多少事件的活动数量。同时与它同在。

我一直在努力教自己做大熊猫,但我甚至不确定从哪里开始寻找。我可以找到许多符合给定条件的行的求和示例,例如"> 2",但似乎无法掌握如何迭代行以根据当前行中的值有条件地对列进行求和。

3 个答案:

答案 0 :(得分:1)

到此为止。这将是缓慢的。

请注意,这会将每一行计为与自身重叠,因此结果列永远不会为0.(从结果中减去1以反向执行。)

import pandas as pd
df = pd.DataFrame({'start_time': [4,3,1,2],'end_time': [7,5,3,8]})
df = df[['start_time','end_time']] #just changing the order of the columns for aesthetics

def overlaps_with_row(row,frame):
    starts_before_mask = frame.start_time <= row.start_time
    ends_after_mask = frame.end_time > row.start_time
    return (starts_before_mask & ends_after_mask).sum()

df['number_which_overlap'] = df.apply(overlaps_with_row,frame=df,axis=1)

收率:

In [8]: df
Out[8]: 
   start_time  end_time  number_which_overlap
0           4         7                     3
1           3         5                     2
2           1         3                     1
3           2         8                     2

[4 rows x 3 columns]

答案 1 :(得分:0)

您可以尝试下面的代码来获得最终结果。

import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([[2,10],[5,8],[3,8],[6,9]]),columns=["start","end"])

active_events= {}
for i in df.index:
    active_events[i] = len(df[(df["start"]<=df.loc[i,"start"]) & (df["end"]> df.loc[i,"start"])])
last_columns = pd.DataFrame({'No. active events' : pd.Series(active_events)})

df.join(last_columns)

答案 2 :(得分:0)

def counter (s: pd.Series):
return ((df["start"]<= s["start"]) & (df["end"] >= s["start"])).sum()

df["count"] = df.apply(counter , axis = 1)

感觉这个方法简单很多,使用apply方法。这并没有像 apply 函数那样真正降低速度,虽然不如 cumsum() 或 cum 等 python 原生函数快,但它应该比使用 for 循环更快。