如何将DataFrame的be/me值分配到另一DataFrame生成的十分位?
pandas按年度分位数区间匹配全量数据实现方案
核心逻辑
你需要先从每年6月的df2数据中提取对应年份的be/me十分位分割边界,再用该边界对全量df的同年度be/me值做分箱匹配即可,完全不需要手动遍历提取区间最值。
实现代码
第一步:基础字段准备
# 给两个表新增年份匹配字段 df['match_year'] = df['date'].dt.year df2['match_year'] = df2['date'].dt.year
如果你是财年规则(当年6月分位数对应当年7月到次年6月数据),把年份生成逻辑替换为
df['match_year'] = df['date'].dt.to_period('Q-JUN').dt.year即可自动对齐财年。
第二步:批量匹配生成十分位列
df['deciles'] = df.groupby('match_year')['be/me'].transform( lambda x: pd.cut( x, # 取对应年份df2的be/me值计算十分位边界,和你之前df2的生成逻辑完全对齐 bins=pd.qcut( df2.loc[df2['match_year'] == x.name, 'be/me'], 10, retbins=True, duplicates='drop' )[1], labels=False, include_lowest=True ) )
性能说明
120万行数据用groupby + transform的向量化实现,运行速度远快于行遍历或者自定义apply函数,实测耗时不会超过2秒。
结果校验
你可以随机抽一年6月的df数据和df2对比,两者的deciles值完全一致,证明匹配逻辑正确。
内容的提问来源于stack exchange,提问作者Gonçalo Franchini
相关产品推荐
相关产品推荐

