如何在R中拆分行数不均的长列并命名列 处理门店嵌套库存数据
单列嵌套库存数据转门店宽表实现方案
需求说明
你现有的数据为单列存储的多门店库存信息,规则如下:
- 每个商品固定包含9项属性,顺序为:No(编号)、Item(商品名)、规格、Expiry Date(有效期)、Manufacturer(生产商)、Quantity(数量)、Unit Price(单价)、Discount(折扣)、Total Price(总价)
- 商品编号回到1时代表切换到下一家门店,最终需要将同一家门店的所有商品信息横向排列,单店对应一行输出
实现方案
方案1:Excel Power Query 零代码实现
适合少量数据、不会代码的用户,操作步骤如下:
- 把原始单列数据导入Excel,选中整列后点击「数据」选项卡→「从表格/范围」进入Power Query编辑器
- 新增索引列:点击「添加列」→「索引列」→选择从0开始
- 标记商品分组:新增自定义列,公式输入
Number.IntegerDivide([索引],9),得到每个商品对应的分组ID - 标记属性位置:新增自定义列,公式输入
Number.Mod([索引],9),0到8依次对应9项商品属性 - 透视属性列:选中「属性位置」列,点击「转换」→「透视列」,值选择原始数据列,聚合方式选「不要聚合」
- 标记门店ID:新增自定义列,公式输入
if [No] = "1" then [商品分组ID] else null,右键点击门店ID列选择「填充」→「向下」 - 按门店ID分组:选中「门店ID」列,点击「转换」→「分组依据」,操作选择「所有行」
- 展开分组后的表,将同门店的多组商品属性横向拼接,重命名列后导出即可得到目标宽表
方案2:Python 脚本批量处理
适合数据量较大、需要重复处理的场景,代码如下:
import pandas as pd # 1. 读取原始单列数据,假设数据存放在stock.txt中,每行一个值 with open('stock.txt', 'r', encoding='utf-8') as f: lines = [line.strip() for line in f.readlines() if line.strip()] # 2. 按9行一组拆分每个商品的属性 goods_list = [] for i in range(0, len(lines), 9): goods = lines[i:i+9] goods_list.append({ 'No': goods[0], 'Item': goods[1], 'Size': goods[2], 'Exp': goods[3], 'Manuf': goods[4], 'Qty': goods[5], 'Unit': goods[6], 'Dis': goods[7], 'Total': goods[8] }) # 3. 按门店分组,遇到No=1就新建门店行 shop_rows = [] current_shop = [] for goods in goods_list: if goods['No'] == '1' and current_shop: # 把当前门店的所有商品属性横向拼接成一行 shop_row = {} for idx, g in enumerate(current_shop): suffix = f"_{idx+1}" if idx >0 else "" for k, v in g.items(): shop_row[f"{k}{suffix}"] = v shop_rows.append(shop_row) current_shop = [] current_shop.append(goods) # 补充最后一个门店的数据 if current_shop: shop_row = {} for idx, g in enumerate(current_shop): suffix = f"_{idx+1}" if idx >0 else "" for k, v in g.items(): shop_row[f"{k}{suffix}"] = v shop_rows.append(shop_row) # 4. 导出为Excel result = pd.DataFrame(shop_rows) result.to_excel('门店库存宽表.xlsx', index=False)
内容的提问来源于stack exchange,提问作者Samia Abdelhafiz
相关产品推荐
相关产品推荐

