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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 16:24:00