如何统计落在df_1各时间区间内的df_2数据行数
Pandas 区间匹配计数实现方案
这里提供两种常用实现方式,可根据数据量大小选择:
方案1:
apply逐行判断(适合小数据量,写法直观)
核心逻辑是遍历df_1每一行,统计df_2中time落在当前行时间区间的行数,代码示例如下:import pandas as pd # 构造示例数据(实际使用时替换为自己的数据源即可) df_1 = pd.DataFrame({ 'start_time': [0, 77, 220, 268, 391], 'end_time': [30, 107, 250, 298, 421] }) df_2 = pd.DataFrame({ 'time': [100, 392, 399] }) # 核心计算逻辑 df_1['count'] = df_1.apply( lambda row: ((df_2['time'] >= row['start_time']) & (df_2['time'] <= row['end_time'])).sum(), axis=1 ) # 输出结果 print(df_1)方案2:向量化广播运算(适合大数据量,性能更高)
利用numpy广播特性做批量判断,避免Python层循环开销,性能远超逐行apply,代码示例如下:import pandas as pd import numpy as np # 构造示例数据同上 df_1 = pd.DataFrame({ 'start_time': [0, 77, 220, 268, 391], 'end_time': [30, 107, 250, 298, 421] }) df_2 = pd.DataFrame({ 'time': [100, 392, 399] }) # 核心计算逻辑 time_arr = df_2['time'].values start_arr = df_1['start_time'].values[:, None] end_arr = df_1['end_time'].values[:, None] df_1['count'] = ((time_arr >= start_arr) & (time_arr <= end_arr)).sum(axis=1) # 输出结果 print(df_1)
两种方案运行后输出的df_1都和给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者MattiH
相关产品推荐
相关产品推荐

