Pandas匹配嵌套列表取值并新增重量计算列的实现咨询
解决方案
存储结构优化建议
你当前用嵌套列表存储重量映射查询效率很低,推荐先转为字典结构,查询时间复杂度为O(1),代码如下:
import pandas as pd # 注意原嵌套列表里的"aliuminium19"是拼写错误,要修正为和df一致的"aluminium19",否则匹配失败 weightsPerM2 = [["aluminium19", 14], ["steel15", 20], ["steel25", 35], ["wood", 8], ["steel10", 13]] # 转字典,key为匹配标识,value为每平米重量 weight_map = {item[0]: item[1] for item in weightsPerM2}
需求1:新增m2面积列
直接用Pandas向量化运算即可,无需遍历,效率远高于循环:
# 毫米转米后计算单块面积*总数量 df['m2'] = (df['sizeL(mm)'] / 1000) * (df['sizeW(mm)'] / 1000) * df['pcs']
问题1:按条件匹配重量值
如果坚持用原嵌套列表,遍历匹配的代码如下:
def get_weight(key): for item in weightsPerM2: if item[0] == key: return item[1] # 未匹配到返回空值 return None
更推荐用上面的字典结构,直接weight_map.get(key)即可获取对应值,无需遍历。
问题2:新增Weights列
首先生成用于匹配的key:材质+厚度(厚度为空时仅取材质),再匹配重量后乘以面积即可:
# 生成匹配key:厚度非空则拼接材质+厚度,否则只用材质 df['match_key'] = df.apply(lambda x: f"{x['itemMaterial']}{int(x['thickness'])}" if pd.notna(x['thickness']) else x['itemMaterial'], axis=1) # 匹配每平米重量 df['weight_per_m2'] = df['match_key'].map(weight_map) # 计算总重量 df['weights'] = df['m2'] * df['weight_per_m2']
问题3:筛选匹配/未匹配记录
直接用isna()判断重量是否匹配成功即可:
# 匹配成功的记录 df_matched = df[df['weight_per_m2'].notna()].copy() # 未匹配的条目提取为列表,格式为(材质, 厚度) unmatched_list = df[df['weight_per_m2'].isna()][['itemMaterial', 'thickness']].values.tolist() # 后续可直接打印unmatched_list用于核查
结果说明
示例数据运行后,第一行steel15的m2为6,weights为120,和你的预期一致;wood行厚度为空,匹配key为wood,可正常匹配到重量8。
内容的提问来源于stack exchange,提问作者Justme4ever
相关产品推荐
相关产品推荐

