【问题标题】:TypeError: expected string or bytes-like object when using regex on pandas dataframeTypeError:在熊猫数据帧上使用正则表达式时预期的字符串或类似字节的对象
【发布时间】:2017-10-02 06:14:09
【问题描述】:

我有一个由零件订单组成的数据框,我正在尝试对其进行标准化,以便更好地分析数据。数据框已使用以下代码从各种 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 形式引入,可能会被误传。

最重要的是,一些公司的数据具有奇怪的价格格式,会在 PRICE 字段中随机插入空格(除了 $ 和 ,)。

这会导致我的数据如下所示

    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 value in range(len(data)):)。

但是,无论我尝试什么,我都会收到 TypeError:预期的字符串或类似字节的对象

我检查了该列的 dtype,它指出 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 上的正则表达式有什么问题以及如何修复它?

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

【问题讨论】:

  • 您传递给它的是一个Series 对象,它不是str norba bytes 对象。 re.sub 不关心你的 pandas 对象的 dtype,它关心你的 Python 对象type

标签: python regex pandas dataframe


【解决方案1】:

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

df['PRICE'] = df['PRICE'].str.replace('\s+|,|\$', '')

你得到

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

【讨论】:

  • 一个未知的副作用是这会导致已经具有预期 PRICE 格式的条目变为 nan。我认为发生这种情况是因为这些值不是字符串而是浮点数。我认为这意味着我只需要选择包含这些字符之一的行,但是如果 re.sub 读取列的 dtype 而不是单个行,我将如何使用 .loc 执行此操作?
  • 我在这里找到了后续问题的解决方案:stackoverflow.com/questions/43187436/… 简而言之,我必须在 .str 函数之前添加 .astype(str) 所以它最终成为 df['PRICE' ] = df['PRICE'].astype(str).str.replace('\s+|,|\$','')
  • 对不起,我错过了这两条消息,怪罪于周末:) 我认为该列是字符串,看到 $ 符号,但很高兴你解决了。万事如意
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 2020-10-20
  • 2019-10-31
  • 1970-01-01
  • 2018-10-17
  • 2020-07-08
  • 2018-05-04
相关资源
最近更新 更多