Pandas拆分含多行文本的列时遇长度不匹配错误求解决
Pandas拆分带多行文本的Desc列报错解决
问题场景
Pandas数据集的Desc列包含不定行数的多行文本,要把该列拆成两列:普通文本列Desc,以及特殊符号(@、())开头的内容列Ret。执行拆分代码时触发Columns must be same length as key错误。
原始数据
================================ It | Desc ================================ 0 coat | Bos @Target@ B2 @Sfop re@ 1 boots | Wos (DSW) ================================
报错代码
import pandas as pd # 创建数据集 item = ['coat','boots'] dec = ["Bos @Target@\n B2 @Sfop re@", "Wos (DSW)"] df = pd.DataFrame(item, columns=['It']) df['Desc'] = dec print(df) # 报错的拆分代码 df[["Desc", "Ret"]] = df["Desc"].str.findall("\w+").apply(pd.Series)
错误原因
- 正则
\w+只能匹配纯字母数字的单词,直接过滤掉了带特殊符号的目标内容(比如@Target@、(DSW)); - 拆分后的数据长度不一致:coat对应的
Desc拆分后有4个元素,boots只有2个,强行赋值给固定的两列时,列长度与拆分结果不匹配,触发报错; - 没有处理
Desc里的多行文本,原代码直接对整个单元格内容拆分,不符合每行拆分的需求。
解决代码
import pandas as pd # 构建原始数据集 item = ['coat','boots'] dec = ["Bos @Target@\n B2 @Sfop re@", "Wos (DSW)"] df = pd.DataFrame(item, columns=['It']) df['Desc'] = dec # 1. 把Desc中的多行文本拆成单独行,保留原索引 df_expanded = df.assign(Desc=df['Desc'].str.split('\n')).explode('Desc') # 去除每行首尾空格 df_expanded['Desc'] = df_expanded['Desc'].str.strip() # 2. 用正则拆分每行:匹配「普通单词 + 特殊符号开头的内容」 split_result = df_expanded['Desc'].str.extract(r'^(\w+)\s+([@(].*?[@)])$', expand=True) split_result.columns = ['Desc', 'Ret'] # 3. 合并得到最终结果 df_final = pd.concat([df_expanded['It'], split_result], axis=1) print(df_final)
最终输出
It Desc Ret 0 coat Bos @Target@ 0 coat B2 @Sfop re@ 1 boots Wos (DSW)
如果需要保持原多行的视觉展示格式,可以通过groupby进一步处理,但上述结果是结构化的标准格式,更适合后续数据操作。
内容的提问来源于stack exchange,提问作者user24599509
相关产品推荐
相关产品推荐

