如何在python中需要整个数据帧时对循环进行矢量化

2024-09-27 00:18:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下问题:我有一个熊猫数据帧,看起来像这样: pd.DataFrame(columns=['eqpid','entering_time','leaving_time'])Eqpid是字符串,而entering\u time和leaving\u time是时间戳。它包含超过4800万行,但前几行是这样的:

         eqpid   entering_time         leaving_time  
4        1       2017-01-01 00:00:10   2017-01-01 00:04:05
7        1       2017-01-01 00:00:20   2017-01-01 00:04:05
10       1       2017-01-01 00:00:33   2017-01-01 00:04:05
15       1       2017-01-01 00:00:46   2017-01-01 00:04:05
22       1       2017-01-01 00:01:00   2017-01-01 00:04:05
24       1       2017-01-01 00:01:11   2017-01-01 00:04:05
27       1       2017-01-01 00:01:24   2017-01-01 00:04:05

现在,我想知道对于每一行,还有多少行满足所有条件:

  1. eqpid=行['eqpid']->;相同eqpid
  2. 输入时间<;行['entering\u time']->;输入时间较小的所有行
  3. 离开时间>;行['entering\u time']->;离开时间大于该行输入时间的所有行

所以,最后,数据帧应该是这样的:

         eqpid   entering_time         leaving_time         result  
4        1       2017-01-01 00:00:10   2017-01-01 00:04:05  0
7        1       2017-01-01 00:00:20   2017-01-01 00:04:05  1
10       1       2017-01-01 00:00:33   2017-01-01 00:04:05  2
15       1       2017-01-01 00:00:46   2017-01-01 00:04:05  3
22       1       2017-01-01 00:01:00   2017-01-01 00:04:05  4
24       1       2017-01-01 00:01:11   2017-01-01 00:04:05  5
27       1       2017-01-01 00:01:24   2017-01-01 00:04:05  6

我尝试了三种方法: 首先,一个简单的迭代,但执行起来太长(几个星期):

array_result = []
for row in df.itertuples():
    sub_df = df.loc[(df['entering_time'] < row['entering_time']) & (df['leaving_time'] > row['entering_time']
    array_result.append(len(sub_df))
df['result'] = array_result

第二,我尝试用以下方式处理pd.apply()

df['result'] = df.apply(lambda row: len(df[(df['eqpid'] == row['eqpid']) & (df['entering_time'] < row['entering_time']) & (df['leaving_time'] > row['entering_time'])]), axis=1)

如果我只取40000行,这就可以了,但是会耗尽整个数据帧的内存。我考虑在数据帧中循环,但在这种情况下,可迭代的sub_df有时会包含超过100万行,因此这也没有帮助,而且似乎是一个“肮脏的解决方案”。你知道吗

第三,我试图通过以下方式将问题矢量化:

def result(data,r_entertime,r_eqpid):
    data['result'] = len(data.loc[(data['eqpid'] == r_eqpid) 
                         & (data['entering_time'] < r_entertime) 
                         & (data['leaving_time'] > r_entertime)])
    return data['result']

df['result'] = result(df,df['entering_time'],df['eqpid'])

这非常快,但不幸的是,新列结果的所有入口都是0。所以,我的问题是,有没有可能在这种情况下使用矢量化?到目前为止,我发现的所有矢量化示例只使用了一行的信息,而我必须在每行的整列中使用查找。你知道吗

有人能帮我吗?你知道吗


Tags: 数据gtdfdatalentime时间result

热门问题