如何按dif与Porcentaje的区间合并两个DataFrame并匹配Inc列?
解决方案
根据你的需求,我们可以通过两种简洁的方式实现基于区间规则的DataFrame关联匹配,以下是具体实现:
方法一:区间切割映射(适合固定规则场景)
利用Pandas的pd.cut函数,直接将dif值映射到对应的区间,匹配Inc数值。
import pandas as pd # 构造你的两个DataFrame df1 = pd.DataFrame({ 'Date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'], 'dif': [-5.0, -4.0, 0.0, 1.0] }) df2 = pd.DataFrame({ 'Porcentaje': [-3.0, 1.0], 'Inc': [0.0, 2.0] }) # 定义区间边界:左边界设为负无穷,包含所有小于-3.0的dif值 bins = [-float('inf')] + df2['Porcentaje'].tolist() # 对应每个区间的Inc值 labels = df2['Inc'].tolist() # 切割dif列并映射Inc值,include_lowest确保左区间包含边界值 df1['Inc'] = pd.cut(df1['dif'], bins=bins, labels=labels, include_lowest=True) # 转换为数值类型(可选,cut默认返回类别型数据) df1['Inc'] = df1['Inc'].astype(float) print(df1)
方法二:近似连接(适合动态区间场景)
使用pd.merge_asof实现基于数值的近似左连接,适配区间规则的动态变化。
import pandas as pd df1 = pd.DataFrame({ 'Date': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04'], 'dif': [-5.0, -4.0, 0.0, 1.0] }) df2 = pd.DataFrame({ 'Porcentaje': [-3.0, 1.0], 'Inc': [0.0, 2.0] }) # 对匹配列排序(merge_asof要求必须排序) df1_sorted = df1.sort_values('dif') df2_sorted = df2.sort_values('Porcentaje') # 匹配小于等于dif的最大Porcentaje值 result = pd.merge_asof(df1_sorted, df2_sorted, left_on='dif', right_on='Porcentaje', direction='backward') # 填充dif小于所有Porcentaje的情况(即< -3.0的行) result['Inc'] = result['Inc'].fillna(df2.loc[df2['Porcentaje'] == -3.0, 'Inc'].values[0]) # 恢复原数据顺序并清理冗余列 result = result.sort_index().drop('Porcentaje', axis=1) print(result)
两种方法对比
- 方法一代码更简洁,适合区间规则固定的场景,直接通过预设区间完成映射。
- 方法二更灵活,当
Porcentaje的区间数量或数值变化时,无需手动调整边界,自动适配规则。
内容的提问来源于stack exchange,提问作者JDK
相关产品推荐
相关产品推荐

