Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用当前行作为条件的累积和_Python_Pandas - Fatal编程技术网

Python 使用当前行作为条件的累积和

Python 使用当前行作为条件的累积和,python,pandas,Python,Pandas,我有一个相当大的数据集,大约有200万条记录,每个记录都有一个开始时间和一个结束时间。我想在每条记录中插入一个字段,计算表中有多少条记录,其中: 开始时间小于或等于“此行”的开始时间 并且结束时间大于“此行”的开始时间 因此,基本上每个记录最后都会计算有多少事件(包括其本身)与它同时处于“活动”状态 我一直在努力教自己如何用熊猫来做这件事,但我甚至不知道从哪里开始寻找。我可以找到许多满足“>2”等给定条件的行求和示例,但似乎无法掌握如何迭代行以根据当前行中的值对列进行条件求和。您可以尝试下面

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

  • 开始时间小于或等于“此行”的开始时间
  • 并且结束时间大于“此行”的开始时间
因此,基本上每个记录最后都会计算有多少事件(包括其本身)与它同时处于“活动”状态


我一直在努力教自己如何用熊猫来做这件事,但我甚至不知道从哪里开始寻找。我可以找到许多满足“>2”等给定条件的行求和示例,但似乎无法掌握如何迭代行以根据当前行中的值对列进行条件求和。

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

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)
将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame(np.array([[2,10],[5,8],[3,8],[6,9]]),columns=[“start”,“end”])
活动_事件={}
对于df.index中的i:
活动事件[i]=len(df[(df[“start”]df.loc[i,“start”]))
last_columns=pd.DataFrame({'No.activeevents':pd.Series(active_events)})
df.join(最后一列)

开始了。这将是缓慢的

请注意,这会将每一行计算为与其自身重叠,因此结果列永远不会为0。(从结果中减去1,以另一种方式进行。)

def计数器(s:pd.系列): return((df[“start”]=s[“start”]).sum() df[“count”]=df.apply(计数器,轴=1)
使用apply方法,这种方法感觉简单多了。这并没有真正影响apply函数的速度,虽然没有像cumsum()或cum这样的python本机函数快,但应该比使用for循环快。

我不知道您想要什么。你能说得更具体些吗?假设第1行的开始时间=4,结束时间=7,第2行的开始时间=3,结束时间=5,第3行的开始时间=1,结束时间=3,第4行的开始时间=2,结束时间=8。你想要什么输出?刚刚意识到我在上面说错了。它应该统计截至此记录开始时间仍处于活动状态的事件。因此,在您的示例中,您将得到以下结果:Row_1:Start:4 End:7 Concurrent:3 | Row_2:Start:3 End:5 Concurrent:2 | Row_3:Start:1 End:3 Concurrent:1 | Row_4:Start:2 End:8 Concurrent:2问题是“当该条目启动时,有多少行处于活动状态”在一个有2M行的数据帧上运行时,速度慢得像在几分钟内一样。我最后这样做了:
for I in a.index:active[I]=len(a[(a['Start']a.loc[I,'Start']))
。你认为这是较慢、较快还是速度相当?
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]
def counter (s: pd.Series):
return ((df["start"]<= s["start"]) & (df["end"] >= s["start"])).sum()

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