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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 12:50:03