Pandas DataFrame拆分产品字段至新行,保留关联收据编号
嘿,我懂你现在的困扰——把一条对应多个产品的收据记录拆成单独行,还得保留对应的收据编号,这个操作说起来简单,但实际写代码的时候很容易踩坑。我给你两种常见的解决思路,不管你用不用数据分析工具都能搞定:
方法一:用Pandas快速处理(适合大量数据)
如果你的数据量比较大,用Pandas来处理效率会很高,而且代码很简洁:
首先模拟你的原始数据(你可以直接替换成自己的数据源):
import pandas as pd # 模拟原始销售数据 data = { '收据编号': ['A', 'B', 'C'], '产品信息': ['L,Q', 'M', 'N,P,R'] } df = pd.DataFrame(data)
然后执行拆分和展开操作,核心用str.split()把产品字符串拆成列表,再用explode()把列表里的每个元素拆成单独行:
# 把产品信息按分隔符拆成列表 df['产品信息'] = df['产品信息'].str.split(',') # 展开列表为单独行,同时重置索引 df = df.explode('产品信息', ignore_index=True)
执行完后,你就能得到想要的结果:
收据编号 产品信息 0 A L 1 A Q 2 B M 3 C N 4 C P 5 C R
额外处理技巧
- 如果你的产品信息分隔符不是逗号,把
str.split(',')里的逗号换成实际分隔符就行(比如分号;) - 如果产品信息里带空格(比如
"L , Q"),可以加一行去掉空格:df['产品信息'] = df['产品信息'].str.strip() - 如果有产品信息为空的行,提前过滤掉:
df = df[df['产品信息'].notna()]
方法二:纯Python列表处理(适合小批量数据)
如果不想用第三方库,用基础的Python循环也能实现:
# 模拟原始数据列表 original_records = [ {'收据编号': 'A', '产品信息': 'L,Q'}, {'收据编号': 'B', '产品信息': 'M'}, {'收据编号': 'C', '产品信息': 'N,P,R'} ] # 用来存储拆分后的新记录 new_records = [] for record in original_records: # 拆分产品信息为单个产品 products = record['产品信息'].split(',') # 给每个产品生成一条新记录 for product in products: new_records.append({ '收据编号': record['收据编号'], '产品信息': product.strip() # 去除产品名前后的空格 }) # 打印拆分后的结果 for item in new_records: print(item)
运行后会输出:
{'收据编号': 'A', '产品信息': 'L'} {'收据编号': 'A', '产品信息': 'Q'} {'收据编号': 'B', '产品信息': 'M'} {'收据编号': 'C', '产品信息': 'N'} {'收据编号': 'C', '产品信息': 'P'} {'收据编号': 'C', '产品信息': 'R'}
内容的提问来源于stack exchange,提问作者Kees
相关产品推荐
相关产品推荐

