如何使用Pandas匹配数值区间从DataFrame提取对应交叉值
pandas区间匹配取值实现方案
pandas没有专门针对字符串格式存储的行列区间做双向匹配的内置方法,我们可以通过解析区间字符串为数值上下限,再逐维度匹配的方式实现需求,具体实现如下:
核心实现逻辑
- 首先解析行维度
Score列的区间字符串,拆分出每个区间的数值上下限,匹配传入分数所属的行 - 再解析列维度(除Score外的所有列)的列名字符串,去掉百分号后拆分区间上下限,匹配传入百分比所属的列
- 直接取DataFrame中行、列交叉位置的数值返回即可
完整代码
import pandas as pd # 初始化示例DataFrame df = pd.DataFrame({ 'Score': {0: '100-199', 1: '200-300', 2: '400-500', 3: '500-700'}, '50-60%': {0: 0.2, 1: 0.3, 2: 0.4, 3: 0.5}, '60-70%': {0: 5.6, 1: 6.4, 2: 7.2, 3: 8.4}, '70-80%': {0: 6.8, 1: 7.9, 2: 8.6, 3: 9.5} }) def get_value(score_val, pct_val): # 匹配分数对应的行索引 target_row = None for idx, range_str in df['Score'].items(): low, high = map(int, range_str.split('-')) if low <= score_val <= high: target_row = idx break # 匹配百分比对应的列名 target_col = None for col_name in df.columns.drop('Score'): range_part = col_name.rstrip('%') low, high = map(int, range_part.split('-')) if low <= pct_val <= high: target_col = col_name break if target_row is None or target_col is None: raise ValueError("传入参数不在已定义的区间范围内") return df.loc[target_row, target_col]
效果验证
- 调用
get_value(124, 70),返回值为6.8,符合预期 - 其他调用示例:
get_value(260, 62)返回6.4get_value(600, 75)返回9.5
若使用场景下调用频率很高,可以在函数外提前预解析所有行、列的区间上下限存为映射表,避免每次调用重复遍历解析,进一步提升运行效率。
内容的提问来源于stack exchange,提问作者kajayan
相关产品推荐
相关产品推荐

