如何用Pandas使inv_number列列表长度与serial_number列一致?
问题:调整inv_number列表长度匹配serial_number长度
需求说明:有两列包含列表的字段serial_number和inv_number,当单个inv_number对应多个serial_number时,需要将inv_number列的列表长度调整为与serial_number列的列表一致。
示例数据:
serial_number inv_number 28 [С029768, С029775] [101040031171, 101040031172] 29 [090020960190402011, 090020960190402009] [210134002523, 210134002524] 31 [1094] [410124000215] 32 [01] [101040022094] 33 [F161B5, F17D86, F17D8D, F1825C, F1825A, F1825D] [101040026976]
其中索引33处有6个serial_number,但只有1个inv_number,需修改为:
[101040026976, 101040026976, 101040026976, 101040026976, 101040026976, 101040026976]
尝试的错误代码:
si.loc[si['inv_number'].apply(len)==1, 'inv_number'].apply (lambda x: [str(x[0])] * si['serial_number'].apply(len).values)
报错信息:
UFuncTypeError: ufunc 'multiply' did not contain a loop with signature matching types (dtype('<U12'), dtype('int64')) -> None
解决方案
错误原因分析
你代码中的问题在于:si['serial_number'].apply(len).values 返回的是整个列的长度数组,而不是当前处理行对应的serial_number长度。当尝试用字符串列表乘以这个数组时,numpy的multiply函数无法处理这种类型匹配,因此抛出错误。
正确实现方式
需要针对每一行获取对应的serial_number长度,再扩展inv_number列表。推荐两种方法:
方法1:逐行处理(全量更新)
使用apply(axis=1)遍历每一行,判断是否需要扩展,直接更新整列:
si['inv_number'] = si.apply( lambda row: row['inv_number'] * len(row['serial_number']) if len(row['inv_number']) == 1 else row['inv_number'], axis=1 )
方法2:仅更新需要修改的行(高效)
先筛选出inv_number长度为1的行,再针对这些行逐行处理:
# 生成筛选掩码 mask = si['inv_number'].apply(len) == 1 # 对符合条件的行更新inv_number si.loc[mask, 'inv_number'] = si.loc[mask].apply( lambda row: [row['inv_number'][0]] * len(row['serial_number']), axis=1 )
验证结果
执行后,索引33的inv_number会被扩展为6个相同元素的列表,与serial_number长度一致;其他行保持不变。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

