【问题标题】:'expected string or buffer' when using re.match with pandas将 re.match 与 pandas 一起使用时出现“预期的字符串或缓冲区”
【发布时间】:2016-09-15 17:27:41
【问题描述】:

我正在尝试从 csv 文件中清除一些数据。我需要确保“持续时间”类别中的任何内容都与某种格式匹配。我就是这样处理的:

import re
import pandas as pd

data_path = './ufos.csv'
ufos = pd.read_csv(data_path)

valid_duration = re.compile('^[0-9]+ (seconds|minutes|hours|days)$')
ufos_clean = ufos[valid_duration.match(ufos.Duration)]

ufos_clean.head()

这给了我以下错误:

TypeErrorTraceback (most recent call last)
<ipython-input-4-5ebeaec39a83> in <module>()
      6 
      7 valid_duration = re.compile('^[0-9]+ (seconds|minutes|hours|days)$')
----> 8 ufos_clean = ufos[valid_duration.match(ufos.Duration)]
      9 
     10 ufos_clean.head()

TypeError: expected string or buffer

我之前使用了类似的方法来清理数据,而没有使用正则表达式。我做错了什么?

编辑:

MaxU 让我最接近,但最终奏效的是:

valid_duration_RE = '^[0-9]+ (seconds|minutes|hours|days)$'
ufos_clean = ufos
ufos_clean = ufos_clean[ufos.Duration.str.contains(valid_duration_RE)]

那里可能有很多冗余,我对 python 还很陌生,但它确实有效。

【问题讨论】:

  • ufos.Duration 是什么?类型:type(ufos.Duration)
  • 这就是问题所在。我将尝试使用ufos.Duration.apply(str) 进行投射,看看是否有效
  • 所以这种铸造方法不起作用。 ufos.Duration 到一个字符串?

标签: python regex pandas dataframe


【解决方案1】:

您可以使用矢量化.str.match() 方法:

valid_duration_RE = '^[0-9]+ (seconds|minutes|hours|days)$'
ufos_clean = ufos[ufos.Duration.str.contains(valid_duration_RE)]

【讨论】:

  • @i.,是的,谢谢!我没有注意到 .str.match() 被弃用了
【解决方案2】:

我猜你想要反过来(未测试):

import re
import pandas as pd

data_path = './ufos.csv'
ufos = pd.read_csv(data_path)

def cleanit(val):
    # your regex solution here
    pass

ufos['ufos_clean'] = ufos['Duration'].apply(cleanit)

毕竟,ufosDataFrame

【讨论】:

  • 我不太喜欢这个解决方案。我正在尝试创建一个名为ufos_clean 的新清理DataFrame,它只包含Duration 处于有效格式的行。我不是想在现有的DataFrame 中添加新的东西
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多