如何根据Quantity列值将Barcode列分号分隔值拆分为对应数量独立行
按Quantity字段生成对应行数并拆分Barcode字段处理方案
- 核心处理规则:
- 最终输出的行数与每行的
Quantity值完全一致 - 原表
Barcode字段为英文分号;分隔的字符串,拆分后每个独立值依次作为对应行的Barcode取值 - 若拆分后的Barcode总数量小于
Quantity值,剩余行的Barcode字段留空即可(已明确拆分后Barcode数量不会超过Quantity值)
- 最终输出的行数与每行的
示例输入:
| Name | Quantity | Barcode +--------------+-------------+----------------------------- | Apple | 5 | barcode1;barcode2;barcode3
预期输出:
| Name | Barcode +--------------+---------- | Apple | barcode1 | Apple | barcode2 | Apple | barcode3 | Apple | | Apple |
Pandas 实现代码
import pandas as pd import numpy as np # 示例源数据,可替换为自己的读表逻辑 df = pd.DataFrame({ "Name": ["Apple"], "Quantity": [5], "Barcode": ["barcode1;barcode2;barcode3"] }) def expand_row(row): barcodes = row["Barcode"].split(";") # 补空值到Quantity指定长度 barcodes += [""] * (row["Quantity"] - len(barcodes)) return pd.DataFrame({ "Name": [row["Name"]]*row["Quantity"], "Barcode": barcodes }) # 逐行处理后合并得到结果 result_df = pd.concat(df.apply(expand_row, axis=1).tolist(), ignore_index=True) print(result_df)
MySQL 8.0+ 实现代码
WITH RECURSIVE num_seq AS ( -- 生成数字序列,最大数值可按需调整 SELECT 1 AS n UNION ALL SELECT n + 1 FROM num_seq WHERE n < 1000 ), source_data AS ( -- 替换为自己的源数据表查询 SELECT 'Apple' AS Name, 5 AS Quantity, 'barcode1;barcode2;barcode3' AS Barcode ) SELECT s.Name, IF(n.n <= LENGTH(s.Barcode) - LENGTH(REPLACE(s.Barcode, ';', '')) + 1, SUBSTRING_INDEX(SUBSTRING_INDEX(s.Barcode, ';', n.n), ';', -1), '') AS Barcode FROM source_data s JOIN num_seq n ON n.n <= s.Quantity;
内容的提问来源于stack exchange,提问作者Lee Wen Ping
相关产品推荐
相关产品推荐

