如何基于区间下限匹配合并不同规模/索引的Pandas DataFrame
Pandas区间匹配:为DataFrame值匹配对应区间左端点
给定两个Pandas DataFrame:
import pandas as pd df1 = pd.DataFrame({'col1': [0.5, 0.75, 1.1, 1.6, 2, 3, 5.5, 10, 11.2] }) df2 = pd.DataFrame({'col2': [0, 3, 10,15] })
需要为df1的col1每个值匹配df2col2中对应的区间左端点,匹配规则为:df2['col2'].iloc[y] <= df1['col1'].iloc[x] < df2['col2'].iloc[y+1],最终预期得到的result列值为:[0, 0, 0, 0, 0, 3, 3, 10, 10]。
方法1:使用pd.cut
利用pd.cut直接将数值分配到指定区间,并映射到区间左端点:
# 提取区间边界 bins = df2['col2'].tolist() # 为col1值分配区间,labels设为区间左端点(去掉最后一个边界) df1['result'] = pd.cut(df1['col1'], bins=bins, labels=bins[:-1], include_lowest=True) # 转换为数值类型(可选,cut默认返回分类类型) df1['result'] = df1['result'].astype(float)
include_lowest=True确保最左侧区间包含最小值,严格符合左闭右开的匹配规则。
方法2:使用numpy.digitize
通过numpy.digitize获取值所在区间的索引,再匹配对应左端点:
import numpy as np bins = df2['col2'].tolist() # digitize返回区间右边界的索引,减1得到左端点索引 indices = np.digitize(df1['col1'], bins, right=False) - 1 # 根据索引提取对应左端点 df1['result'] = df2['col2'].iloc[indices].values
right=False指定区间为左闭右开,和题目要求的规则一致,减1后刚好对应左端点的位置。
两种方法运行后,df1都会生成符合预期的result列。
内容的提问来源于stack exchange,提问作者AdR
相关产品推荐
相关产品推荐

