如何在pandas中使用现有列数据创建新行实现列转行
pandas 多批次销售列拆分转为行实现方案
核心逻辑是将不同批次的销售列统一重命名为相同结构后合并,自动过滤空值记录,全程保留原ID和prevenda字段。
实现代码
基础版本(适用于固定少批次场景)
import pandas as pd # 假设你的原始DataFrame变量名为df # 1. 提取初始核心售卖数据 df_base = df[["ID", "prevenda", "Product", "Value"]].copy() # 2. 处理第1批新增销售列,重命名为统一结构,删除全空的无效行 df_batch1 = df[["ID", "prevenda", "Produc01", "Value01"]].rename( columns={"Produc01": "Product", "Value01": "Value"} ).dropna(subset=["Product", "Value"], how="all") # 3. 合并所有数据集得到最终结果 df_result = pd.concat([df_base, df_batch1], ignore_index=True)
通用版本(自动识别所有批次列,适配多批次扩展场景)
如果后续还会新增Produc02/Value02、Produc03/Value03等更多批次列,可以用自动遍历的方式实现:
import pandas as pd df_list = [] # 先加入核心批次数据 df_list.append(df[["ID", "prevenda", "Product", "Value"]].copy()) # 自动遍历识别所有带数字后缀的销售批次 batch_num = 1 while True: prod_col = f"Produc{batch_num:02d}" value_col = f"Value{batch_num:02d}" # 检测列是否存在,不存在就停止遍历 if prod_col not in df.columns or value_col not in df.columns: break # 处理当前批次数据 tmp_df = df[["ID", "prevenda", prod_col, value_col]].rename( columns={prod_col: "Product", value_col: "Value"} ).dropna(subset=["Product", "Value"], how="all") df_list.append(tmp_df) batch_num += 1 # 合并所有批次数据 df_result = pd.concat(df_list, ignore_index=True)
说明
- 若不需要保留
prevenda字段,把代码中列筛选部分的prevenda删掉即可,输出结果和你给出的预期格式完全一致 - 如果你的批次列命名规则不同(比如为
Product_1/Value_1),修改代码中列名拼接的规则即可适配
内容的提问来源于stack exchange,提问作者Leonardo Amador
相关产品推荐
相关产品推荐

