Pandas拆分商品重量列遇"Columns must be same length"报错求解
问题解析与解决方案
错误原因
你用str.rsplit("\d{3}g", n=1, expand=True)的思路完全错了:
\d{3}g是你要提取的重量内容,不是拆分的分隔符,用它做拆分的话,拆分后会直接丢掉重量值,还会把商品名切成两部分(如果匹配到的话)。- 一旦数据集中存在不匹配
\d{3}g模式的行(比如重量是两位数、或者格式异常),拆分结果只会返回1列,和你要赋值的2列数量不匹配,直接触发Columns must be same length as key报错。
正确拆分方法(适配10万行大数据)
因为重量都是以数字+g结尾,不管前面有没有空格,用正则提取是最高效的方案,推荐两种实现方式:
方式一:一次性拆分商品名和重量
用str.extract配合正则,直接从原字符串中拆分出两部分:
import pandas as pd # 针对你的数据集执行以下代码 df_transactions[['PROD_NAME', 'Weight']] = df_transactions['PROD_NAME'].str.extract(r'^(.*?)(\d+g)$', expand=True) # 清理商品名末尾可能残留的空格 df_transactions['PROD_NAME'] = df_transactions['PROD_NAME'].str.strip()
正则说明:
^(.*?):非贪婪匹配开头到重量前的所有内容(自动适配有无空格的情况)(\d+g)$:匹配字符串末尾的数字+g格式的重量
方式二:先提取重量,再清理商品名
如果觉得一次性拆分不够直观,可以分两步操作:
# 第一步:提取末尾的重量列 df_transactions['Weight'] = df_transactions['PROD_NAME'].str.extract(r'(\d+g)$', expand=True) # 第二步:从原商品名中移除重量部分并清理空格 df_transactions['PROD_NAME'] = df_transactions['PROD_NAME'].str.replace(r'\d+g$', '', regex=True).str.strip()
边界情况适配
如果数据中存在其他格式的重量(比如两位数重量、大写G),可以把正则调整为(\d+[gG])$,覆盖更多场景。
内容的提问来源于stack exchange,提问作者Allison Chaney
相关产品推荐
相关产品推荐

