String 应用Lambda对数字重新编码(棘手的)字符串
我有一个NFL场景的大数据集,但为了说明,让我把它简化为两个观察结果的列表。像这样:String 应用Lambda对数字重新编码(棘手的)字符串,string,list,python-3.x,lambda,String,List,Python 3.x,Lambda,我有一个NFL场景的大数据集,但为了说明,让我把它简化为两个观察结果的列表。像这样: data = [[scenario1],[scenario2]] 以下是数据集的组成部分: data[0][0] >>"It is second down and 3. The ball is on your opponent's 5 yardline. There is 3 seconds left in the fourth quarter. You are down by 3 points.
data = [[scenario1],[scenario2]]
以下是数据集的组成部分:
data[0][0]
>>"It is second down and 3. The ball is on your opponent's 5 yardline. There is 3 seconds left in the fourth quarter. You are down by 3 points."
data[1][0]
>>"It is first down and 10. The ball is on your 20 yardline. There is 7 minutes left in the third quarter. You are down by 10 points."
我不能用这样的字符串格式构建任何模型。因此,我想将这些场景重新编码为新的列(或功能,如果您愿意),作为定量值。我想我应该先把数据框平方:
down = 0
yards = 0
yardline = 0
seconds = 0
quarter = 0
points = 0
data = [[scenario1, down, yards, yardline, seconds, quarter, points], [scenario2, yards, yardline, seconds, quarter, points]]
现在是棘手的部分,我必须从scenario列中的信息填充新列。棘手,因为例如,在第二句中,如果“对手的”一词出现,这意味着我们必须将其计算为100——不管码线数是多少。在上述场景1
变量中,它应该是100-5=95
起初我认为我应该把所有的数字分开,扔掉单词,但正如上面指出的,一些单词实际上是正确分配数量值所必需的。我从来没有做过这么精细的兰姆达。或者,也许,一辆lambda不是正确的选择?我愿意接受任何/所有的建议
以下是我希望看到的内容(从scenario1
如果我输入:
data[0][1:]
>>2,3,95,3,4,-3
谢谢lambda不是您想要的方式。Python的
re
模块是您的朋友:)
就个人而言,我发现像[[scenario,],…]
这样存储数据有点奇怪,但要将数据添加到每个场景中:
for s in data:
s.extend(getScenarioData(s[0]))
我建议使用字典列表,因为使用像data[0][3]
这样的索引可能会在一两个月后变得混乱:
def getScenarioData(scenario):
# instead of data = []
data = {'scenario':scenario}
# instead of data.append(downs)
data['downs'] = downs
...
scenarios = ['...', '...']
data = [getScenarioData(s) for s in scenarios]
编辑:当您想从DICT中获取值时,使用get
方法防止引发KeyError
,因为get
默认为None
如果找不到键:
for s in data:
print(s.get('quarter'))
哇,那太有用了!!我将尝试不同的数据帧,看看哪一帧效果更好。我开始以你的方式看待DICT列表。很高兴我能帮上忙:)我确信它能工作,但我得到错误“NoneType”对象没有属性:group。查看数据后,我注意到一些场景非常简单,比如“你下降了3。你该怎么办?”我应该使用
试试/吗?或者是否有其他方法可以默认为0或na?我注意到你的一些代码有如果,也许我应该在所有的代码上加上标签?我不确定场景的语法有多严格,所以我让它很容易出错。我将编辑答案,以说明在每个搜索中未找到匹配项。现在我看到了搜索的威力。同样感谢get
提示,它现在工作得非常好。你就是那个人!
for s in data:
print(s.get('quarter'))