我有一个相当大的数据集,大约有200万条记录,每条记录都有一个开始时间和一个结束时间。我想在每个记录中插入一个字段,该字段计算表格中有多少条记录:
因此,基本上每条记录最终都会计算出包括其本身在内的多少事件的活动数量。同时与它同在。
我一直在努力教自己做大熊猫,但我甚至不确定从哪里开始寻找。我可以找到许多符合给定条件的行的求和示例,例如"> 2",但似乎无法掌握如何迭代行以根据当前行中的值有条件地对列进行求和。
答案 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 循环更快。