如何在Python中解析复杂的季节和情节格式
我正在尝试清理一些数据,并且在Python/Pandas中很难做到这一点。我有一系列电视节目标题的数据。我想做以下工作:如何在Python中解析复杂的季节和情节格式,python,regex,parsing,pandas,unicode,Python,Regex,Parsing,Pandas,Unicode,我正在尝试清理一些数据,并且在Python/Pandas中很难做到这一点。我有一系列电视节目标题的数据。我想做以下工作: 检查字符串末尾是否有整数 如果只有一个整数,则返回字符串该部分之前的所有内容 如果字符串中有多个部分是整数,则返回字符串的第一个全部,然后返回第一个整数 以下是我的意见: Brooklyn 99 103 Hit The Floor 110 产出: Brooklyn 99 Hit The Floor 作为一个单独的函数(或多个函数),我想删除任何附加的季节/剧集格式和其后的
Brooklyn 99 103
Hit The Floor 110
产出:
Brooklyn 99
Hit The Floor
作为一个单独的函数(或多个函数),我想删除任何附加的季节/剧集格式和其后的任何字符串:
投入
Hot in Cleveland s6 ep03
Mutt & Stuff #111
LHH ATL 08/31a HD
LHH ATL 04/04 Check
Esther With Hot Chicks Ep. 1
Suspect 2/24
Suspect 2/24 HD
输出
Hot in Cleveland
Mutt & Stuff
LHH ATL
LHH ATL
Esther With Hot Chicks
Suspect
Suspect
我编写了这样一个函数:
def digit(value):
return value.isdigit()
def another(value):
li = value.split(" ")
x = len(filter(digit, value))
ind = li.index( str(filter(digit, li)[0]) )
try:
if x > 1:
return " ".join(li[:ind+1])
else:
value.str.replace(r'(\D+).*', r'\1').str.replace(r'\s+.$', '').str.strip()
except:
return value.str.replace(r'(\D+).*', r'\1').str.replace(r'\s+.$', '').str.strip()
data["LongTitleAdjusted"] = data["Long Title"].apply(another)
data["LongTitleAdjusted"]
但我得到了这个错误:
AttributeError Traceback (most recent call last)
<ipython-input-49-3526b96a8f5a> in <module>()
15 return value.str.replace(r'(\D+).*', r'\1').str.replace(r'\s+.$', '').str.strip()
16
---> 17 data["LongTitleAdjusted"] = data["Long Title"].apply(another)
18 data["LongTitleAdjusted"]
C:\Users\lehmank\AppData\Local\Continuum\Anaconda2\lib\site- packages\pandas\core\series.pyc in apply(self, func, convert_dtype, args, **kwds)
2167 values = lib.map_infer(values, lib.Timestamp)
2168
-> 2169 mapped = lib.map_infer(values, f, convert=convert_dtype)
2170 if len(mapped) and isinstance(mapped[0], Series):
2171 from pandas.core.frame import DataFrame
pandas\src\inference.pyx in pandas.lib.map_infer (pandas\lib.c:62578)()
<ipython-input-49-3526b96a8f5a> in another(value)
13 value.str.replace(r'(\D+).*', r'\1').str.replace(r'\s+.$', '').str.strip()
14 except:
---> 15 return value.str.replace(r'(\D+).*', r'\1').str.replace(r'\s+.$', '').str.strip()
16
17 data["LongTitleAdjusted"] = data["Long Title"].apply(another)
AttributeError: 'unicode' object has no attribute 'str'
AttributeError回溯(最近一次调用)
在()
15返回值.str.replace(r'(\D+).*',r'\1').str.replace(r'\s+.$','').str.strip()
16
--->17数据[“长标题调整”]=数据[“长标题”]。应用(另一个)
18数据[“LongTitleAdjusted”]
C:\Users\lehmank\AppData\Local\Continuum\Anaconda2\lib\site-packages\pandas\core\series.pyc在应用中(self、func、convert\u dtype、args、**kwds)
2167 values=lib.map\u推断(值,lib.Timestamp)
2168
->2169 mapped=lib.map\u推断(值,f,convert=convert\u数据类型)
2170如果len(映射)和isinstance(映射[0],系列):
2171从pandas.core.frame导入数据帧
pandas.lib.map\u expert(pandas\lib.c:62578)()中的pandas\src\expression.pyx
在另一个(值)
13 value.str.replace(r'(\D+).*',r'\1').str.replace(r'\s+.$','').str.strip()
14除:
--->15返回值.str.replace(r'(\D+).*',r'\1').str.replace(r'\s+.$','').str.strip()
16
17数据[“长标题调整”]=数据[“长标题”]。应用(另一个)
AttributeError:“unicode”对象没有属性“str”
对于regex这将对您的示例数据集起到作用:
df['title'].str.replace(r'(\D+).*', r'\1').str.replace(r'\s+.$', '').str.strip()
但是它也会将布鲁克林99转换为布鲁克林,有没有办法检查格式末尾是否有多个int并保留第一个int?@KateLehman,我刚刚在你的问题中添加了
regex
标记-希望一些regex专家能够解决这个问题。我想我可以做一些类似if语句的事情,检查字符串中是否有多个int,然后只返回前面的字符串,然后使用你的regex作为else…我找到了一个函数来解决我遇到的问题上面提到过,但是我在regex AttributeError上遇到了一个错误:“unicode”对象没有属性“str”,您知道如何修复这个问题吗?请包含完整的回溯。它会告诉您(和我们)错误发生的位置。感谢您的帮助@skrrgwasmeAre您使用pandas只是为了过滤数据吗?@padraiccnningham correct我正在使用pandas过滤数据,以获得字符串值中的整数数