使用pd.insert报错维度不匹配(预期1维,实际2维)的解决求助
问题描述
我有如下示例数据集:
import pandas as pd import numpy as np df = pd.DataFrame({'col_1':['Region1 (Y0001)','Region2 (Y0002)', 'Region3 (Y0003)','Region4 (Y0004)','Region5 (Y0005)'], 'col_2':np.arange(1,6), 'col_3':np.arange(6,11), 'col_4':np.arange(11,16)})
注:我替换了真实值,但数据类型和结构与真实数据一致。
当我使用pd.insert()执行以下代码时,出现错误:
df.insert(df.columns.get_loc('col_1'), 'new_col', df['col_1'].str.extract(r'\((\w+)\)'))
错误信息为:ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
我通过执行以下代码测试pd.insert()的功能,结果正常:
df.insert(0,'Random_Col',55)
据我观察,该错误是在将pandas升级到1.4.3版本后出现的,之前没有这个问题。但这无法解释为什么上述测试代码能正常运行。
请问该如何解决这个错误?
解决方案
问题根源是str.extract()默认返回二维的DataFrame,而pd.insert()要求插入的是一维的Series或可迭代对象,升级pandas后该参数的维度校验更严格,因此触发错误。
有两种直接的解决方法:
- 方法一:提取结果后取第一列转为Series
df.insert(df.columns.get_loc('col_1'), 'new_col', df['col_1'].str.extract(r'\((\w+)\)').iloc[:, 0]) - 方法二:使用
expand=False参数,让str.extract()直接返回一维Seriesdf.insert(df.columns.get_loc('col_1'), 'new_col', df['col_1'].str.extract(r'\((\w+)\)', expand=False))
测试代码能正常运行是因为传入的标量55会被pandas自动广播为一维Series,符合insert()的参数要求。
内容的提问来源于stack exchange,提问作者Simone Di Claudio
相关产品推荐
相关产品推荐

