首页 > 解决方案 > Python:pandas.DataFrame.insert ValueError:缓冲区的维数错误

问题描述

在 DataFrame 中,我想从始终出现在特定单词之后的字符串中提取整数 (0-9),并将其作为新列添加到特定位置(而不是末尾)。在下面的简化示例中,我想提取单词“数字”之后的整数。

数据框:

testDf = ['Number1', 'number2', 'aNumber8', 'Number6b']
df = pd.DataFrame(testDf, columns=['Tagname'])

Tagname
Number1
number2
aNumber8
Number6b

下面的代码有效,但由于它在数据框的末尾添加了列,所以我必须移动列。

df['Number'] = df['Tagname'].str.extract(r'number*(\d)', re.IGNORECASE)

Tagname    Number
Number1     1
number2     2
aNumber8    8
Number6b    6

insertNum = df['Number']
df.drop(labels=['Number'], axis=1, inplace = True)
df.insert(0, 'Number', insertNum)

Number    Tagname
1         Number1
2         number2
8         aNumber8
6         Number6b

我希望我能做的是使用 .insert(),但这会引发如下所示的 ValueError。

df.insert(0, 'Number', df['Tagname'].str.extract(r'number*(\d)', re.IGNORECASE))

ValueError: Buffer has wrong number of dimensions (expected 1, got 2)

是否可以以这种方式使用 .insert() ?

标签: pythonpandasdataframeinsertvalueerror

解决方案


用于from expand=False,如果省略它会得到一列或多列,因为默认参数是:SeriesSeries.str.extractDataFrameexpand=True

详情

print (df['Tagname'].str.extract(r'number*(\d)', re.IGNORECASE))
   0
0  1
1  2
2  8
3  6

print (df['Tagname'].str.extract(r'number*(\d)', re.IGNORECASE, expand=False))
0    1
1    2
2    8
3    6
Name: Tagname, dtype: object

df.insert(0,'Number',df['Tagname'].str.extract(r'number*(\d)', re.IGNORECASE, expand=False))
print (df)
  Number   Tagname
0      1   Number1
1      2   number2
2      8  aNumber8
3      6  Number6b

推荐阅读