You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:01:16