基于df1非空掩码提取df2数据并转长表的高效实现方法
你可以用pandas的内置方法直接实现,全程向量化操作效率很高,不需要写循环,完整代码如下:
import pandas as pd # 前提保证:df1和df2的timestamp完全对齐、数值列列名完全一致 # 步骤1:生成df1非空位置的掩码 mask = df1.set_index('timestamp').notna() # 步骤2:用掩码提取df2对应位置的值,得到中间表 df_intermediate = df2.set_index('timestamp').where(mask).reset_index() # 步骤3:宽表转长表,删除空值后按时间排序 df_final = df_intermediate.melt( id_vars='timestamp', var_name='Class', value_name='Numero' ).dropna( subset=['Numero'] ).sort_values( by='timestamp' ).reset_index(drop=True)
代码说明:
where方法会保留条件为True位置的原值,其余位置自动填充NaN,刚好匹配你第一步的需求melt是pandas专门用来做宽转长的方法,直接指定主键、新列名即可,最后删去空值就是你要的最终结果
如果你处理的是百万行以上的大表,可以提前把timestamp设为两个表的索引,避免多次set_index的性能消耗。
内容的提问来源于stack exchange,提问作者asimo
相关产品推荐
相关产品推荐

