Python TypeError:在数据帧上使用正则表达式时,应为字符串或类似字节的对象
我有一个由零件订单组成的数据框架,我正试图将其标准化,以便更好地分析数据。数据帧是使用以下代码从各种CSV和XLSX文件编译而成的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) 它们被作为对象读入,因为各种不同的文件来自不
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
norbabytes
对象。re.sub
不关心pandas对象的dtype
,它关心Python对象的type
你给它传递一个Series
对象,它不是str
norbabytes
对象。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; \$,'')抱歉,我错过了这两条消息,归咎于周末:)我假设列是字符串,看到了$符号,但很高兴你解决了。祝你一切顺利