Python TypeError:在数据帧上使用正则表达式时,应为字符串或类似字节的对象

Python TypeError:在数据帧上使用正则表达式时,应为字符串或类似字节的对象,python,regex,pandas,dataframe,Python,Regex,Pandas,Dataframe,我有一个由零件订单组成的数据框架,我正试图将其标准化,以便更好地分析数据。数据帧是使用以下代码从各种CSV和XLSX文件编译而成的 source_data = pd.read_excel(filename,sheet_name,skiprows=HeaderRow-1,dtype=object) source_data = pd.read_csv(filename,skiprows=HeaderRow-1,dtype=object) 它们被作为对象读入,因为各种不同的文件来自不

我有一个由零件订单组成的数据框架,我正试图将其标准化,以便更好地分析数据。数据帧是使用以下代码从各种CSV和XLSX文件编译而成的

    source_data = pd.read_excel(filename,sheet_name,skiprows=HeaderRow-1,dtype=object)
    source_data = pd.read_csv(filename,skiprows=HeaderRow-1,dtype=object)
它们被作为对象读入,因为各种不同的文件来自不同的公司,它们有自己独特的标记特定字段的方法,并且大多数字段无论如何都需要是字符串(零件号、ID号等),如果作为int/float输入,可能会被误传

除此之外,一些公司的数据还具有奇怪的价格格式,在价格字段中随机插入空格(除了$and,)

这导致我的数据如下所示

    P/N         DESCRIPTION     PRICE
    654A321     Item 1          $1 ,330
    783B257     Desc, Item 2    $55
    897653      part 4          $2 3,589
    789A234     Widget          5132.00
我一直在尝试使用如下代码删除[$,]字符:

    data.loc[value,'PRICE'] = re.sub(r"[^0-9]+","",data['PRICE'][value])

    data.loc[value,'PRICE'] = re.sub('\$','',data['PRICE'][value])
    data.loc[value,'PRICE'] = re.sub(' ','',['PRICE'][value])
    data.loc[value,'PRICE'] = re.sub(',','',['PRICE'][value])
3的集合在for循环内(for值在范围内(len(data)):)

然而,无论我尝试什么,我都会收到 TypeError:应为字符串或类似字节的对象

我已经检查了该列的数据类型,它表明data['PRICE']是object类型的,所以我很难看出问题出在哪里

最终目标是将表格式化为

    P/N         DESCRIPTION     PRICE
    654A321     Item 1          1330
    783B257     Desc, Item 2    55
    897653      part 4          23589
    789A234     Widget          5132.00
有人能告诉我re.sub上的正则表达式有什么问题以及如何修复吗


谢谢(并对冗长的问题表示歉意)。

您可以使用str.replace替换空格(\s+)、逗号(,)和$(\$)

你得到

    P/N     DESCRIPTION     PRICE
0   654A321 Item 1          1330
1   783B257 Desc, Item 2    55
2   897653  part 4          23589

可以使用str.replace替换空格(\s+)、逗号(,)和$(\$)

你得到

    P/N     DESCRIPTION     PRICE
0   654A321 Item 1          1330
1   783B257 Desc, Item 2    55
2   897653  part 4          23589

你给它传递一个
Series
对象,它不是
str
norba
bytes
对象。
re.sub
不关心pandas对象的
dtype
,它关心Python对象的
type
你给它传递一个
Series
对象,它不是
str
norba
bytes
对象。
re.sub
不关心pandas对象的
dtype
,它关心Python对象的
type
。未知的副作用是,这会导致已经具有预期价格格式的条目变为nan。我假设发生这种情况是因为值不是字符串,而是floats。我认为这意味着我只需要选择包含其中一个字符的行,但是如果re.sub读取列的数据类型而不是单个行,我将如何使用.loc进行选择?我在这里找到了后续问题的解决方案:简言之,我必须添加.astype(str)在.str函数之前,因此它的结尾是df['PRICE']=df['PRICE'].astype(str).str.replace('\s+,\$,'')很抱歉,我错过了这两条消息,应该归咎于周末:)我假设列是字符串,看到了$符号,但很高兴您解决了这个问题。一个未知的副作用是,这导致已经具有预期价格格式的条目变成nan。我假设发生这种情况是因为这些值不是字符串,而是浮点数。我认为这意味着我只需要选择包含其中一个字符的行,但是如果重新读取列的数据类型而不是单个行,我将如何使用.loc执行此操作?我在这里找到了后续问题的解决方案:简言之,我必须在.str函数之前添加.astype(str),因此它最终成为df['PRICE']=df['PRICE'].astype(str).str.replace('\s+,'\124; \$,'')抱歉,我错过了这两条消息,归咎于周末:)我假设列是字符串,看到了$符号,但很高兴你解决了。祝你一切顺利