我有以下问题:我有一个熊猫数据帧,看起来像这样:
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
现在,我想知道对于每一行,还有多少行满足所有条件:
所以,最后,数据帧应该是这样的:
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。所以,我的问题是,有没有可能在这种情况下使用矢量化?到目前为止,我发现的所有矢量化示例只使用了一行的信息,而我必须在每行的整列中使用查找。你知道吗
有人能帮我吗?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐