使用pandas实现DataFrame Lx列值匹配升序列表对应区间上限
实现方案
你可以直接用pandas内置的pd.cut分箱函数实现需求,不需要写循环遍历,代码如下:
import pandas as pd if __name__ == "__main__": DataExample = [[0.6, 0.36 ,0.00], [0.6, 0.36 ,0.00], [0.9, 0.81 ,0.85], [0.8, 0.64 ,0.91], [1.0, 1.00 ,0.92], [1.0, 1.00 ,0.95], [0.9, 0.81 ,0.97], [1.2, 1.44 ,0.97], [1.0, 1.00 ,0.97], [1.0, 1.00 ,0.99], [1.2, 1.44 ,0.99], [1.1, 1.21 ,0.99]] DataExample = pd.DataFrame(data = DataExample, columns = ['Lx', 'A', 'Ratio']) normalsizes = [0, 0.75, 1, 1.25, 1.5, 1.75 ,2, 2.25, 2.4, 2.5, 2.75, 3, 3.25, 3.5, 3.75, 4, 4.25, 4.5, 4.75, 5, 5.25, 5.5, 5.75, 6] # 核心逻辑:分箱取右边界 DataExample['Lx'] = pd.cut( DataExample['Lx'], bins=normalsizes, labels=normalsizes[1:], # 每个区间对应右边界作为值 right=False, # 区间为左闭右开,符合需求描述的区间规则 include_lowest=True # 包含最小值边界 ).astype(float) print(DataExample)
参数说明
bins:传入预先升序排列的区间边界列表normalsizeslabels:每个区间对应的输出值,这里直接取normalsizes从第二个元素开始的右边界right=False:设置区间为左闭右开,例如[0, 0.75)、[0.75, 1),对应取右边界0.75、1作为结果- 最后转float是因为
pd.cut默认返回分类类型,转数值型方便后续计算
注:你给出的最终结果示例中前两行Lx为1,和你描述的0.6取0.75的规则冲突,如果需要匹配你贴的结果,可将normalsizes中的0.75删除即可。
替代方案(numpy实现)
也可以用np.searchsorted直接定位索引取值,性能更高:
import numpy as np DataExample['Lx'] = np.array(normalsizes)[np.searchsorted(normalsizes, DataExample['Lx'], side='right')]
内容的提问来源于stack exchange,提问作者DaniV
相关产品推荐
相关产品推荐

