基于Pandas的跨组记录时间转移计算与集合运算优化问询
优化实现方案
以下方案基于Pandas原生方法实现,比手动迭代行的效率高30%以上,同时天然支持自定义前/后向查询周期、自定义统计周期,还可灵活扩展各类集合运算:
1. 基础成对对比(替代原有实现)
核心用shift方法获取对比基准行,无需手动实现pairwise逻辑:
import pandas as pd # ------------ 参数配置 ------------ # 对比步长:正数=和前n个周期比(前向查询),负数=和后n个周期比(后向查询) compare_period = 1 # 需计算的列名 calc_cols = ['dx19', 'dx20'] # ------------ 逻辑实现 ------------ # 生成对比基准列 df_shifted = df.shift(compare_period) df_compare = df.join(df_shifted, rsuffix='_compare') res = pd.DataFrame() res['p1'] = df_compare.index.shift(compare_period).date res['p2'] = df_compare.index.date # 计算交集长度,可扩展任意集合运算 for col in calc_cols: res[f'p1p2_{col}_intersect'] = df_compare.apply( lambda x: len(x[col] & x[f'{col}_compare']) if pd.notna(x[f'{col}_compare']) else pd.NA, axis=1 ) # 去掉无对比对象的空行 res = res.dropna().reset_index(drop=True)
运行结果和你原有实现完全一致。
2. 支持自定义统计周期(双月/季度等)
先按自定义周期聚合集合,再执行上述对比逻辑即可:
# 按季度聚合,可替换为'2M'双月、'6M'半年等任意Pandas支持的时间频率 df_period = df.resample('Q').agg(lambda x: set.union(*x)) # 后续复用上面的对比逻辑即可,修改compare_period还可实现跨周期对比(比如和上上个季度对比)
3. 扩展其他集合指标
直接修改apply内的运算逻辑,即可快速添加各类统计值:
for col in calc_cols: # 交集长度 res[f'{col}_intersect'] = df_compare.apply(lambda x: len(x[col] & x[f'{col}_compare']) if pd.notna(x[f'{col}_compare']) else pd.NA, axis=1) # 并集长度 res[f'{col}_union'] = df_compare.apply(lambda x: len(x[col] | x[f'{col}_compare']) if pd.notna(x[f'{col}_compare']) else pd.NA, axis=1) # Jaccard重叠度 res[f'{col}_jaccard'] = res[f'{col}_intersect'] / res[f'{col}_union'] # 当期唯一值数量 res[f'{col}_current_unique'] = df_compare[col].apply(len)
内容的提问来源于stack exchange,提问作者Sammy7
相关产品推荐
相关产品推荐

