'期望的字符串或缓冲区'当与pandas使用re.match时

时间:2016-09-15 17:27:42

标签: python regex pandas dataframe

我正在尝试从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很新,但它确实有效。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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