我在 CSV 文件中有数据。其中一列列出了人名,该列中的所有行都提供了有关该人的一些描述性属性,直到出现下一个人名。我可以通过 LTYPE 列判断该行何时具有名称或属性,该列中的 N 表示该行中的 NAME 值实际上是一个名称,该列中的 A 表示 NAME 列中的数据是一个属性. 属性已编码,我有 600K 行数据。这是一个示例。数据被分组,每个分组的开始由 RID 重置为 1 指示。
{'LTYPE': 'N', 'RID': '1', 'NAME': 'Jason Smith'}
{'LTYPE': 'A', 'RID': '2', 'NAME': 'DA'}
{'LTYPE': 'A', 'RID': '3', 'NAME': 'B'}
{'LTYPE': 'N', 'RID': '4', 'NAME': 'John Smith'}
{'LTYPE': 'A', 'RID': '5', 'NAME': 'BC'}
{'LTYPE': 'A', 'RID': '6', 'NAME': 'CB'}
{'LTYPE': 'A', 'RID': '7', 'NAME': 'DB'}
{'LTYPE': 'A', 'RID': '8', 'NAME': 'DA'}
{'LTYPE': 'N', 'RID': '9', 'NAME': 'Robert Smith'}
{'LTYPE': 'A', 'RID': '10', 'NAME': 'BC'}
{'LTYPE': 'A', 'RID': '11', 'NAME': 'DB'}
{'LTYPE': 'A', 'RID': '12', 'NAME': 'CB'}
{'LTYPE': 'A', 'RID': '13', 'NAME': 'RB'}
{'LTYPE': 'A', 'RID': '14', 'NAME': 'VC'}
{'LTYPE': 'N', 'RID': '15', 'NAME': 'Harvey Smith'}
{'LTYPE': 'A', 'RID': '16', 'NAME': 'SA'}
{'LTYPE': 'A', 'RID': '17', 'NAME': 'AS'}
{'LTYPE': 'N', 'RID': '18', 'NAME': 'Lukas Smith'}
{'LTYPE': 'A', 'RID': '19', 'NAME': 'BC'}
{'LTYPE': 'A', 'RID': '20', 'NAME': 'AS'}
我想创建以下内容:
{'PERSON_ATTRIBUTES': 'DA B ', 'LTYPE': 'N', 'RID': '1', 'PERSON_NAME': 'Jason Smith', 'NAME': 'Jason Smith'}
{'PERSON_ATTRIBUTES': 'DA B ', 'LTYPE': 'A', 'RID': '2', 'PERSON_NAME': 'Jason Smith', 'NAME': 'DA'}
{'PERSON_ATTRIBUTES': 'DA B ', 'LTYPE': 'A', 'RID': '3', 'PERSON_NAME': 'Jason Smith', 'NAME': 'B'}
{'PERSON_ATTRIBUTES': 'BC CB DB DA ', 'LTYPE': 'N', 'RID': '4', 'PERSON_NAME': 'John Smith', 'NAME': 'John Smith'}
{'PERSON_ATTRIBUTES': 'BC CB DB DA ', 'LTYPE': 'A', 'RID': '5', 'PERSON_NAME': 'John Smith', 'NAME': 'BC'}
{'PERSON_ATTRIBUTES': 'BC CB DB DA ', 'LTYPE': 'A', 'RID': '6', 'PERSON_NAME': 'John Smith', 'NAME': 'CB'}
{'PERSON_ATTRIBUTES': 'BC CB DB DA ', 'LTYPE': 'A', 'RID': '7', 'PERSON_NAME': 'John Smith', 'NAME': 'DB'}
{'PERSON_ATTRIBUTES': 'BC CB DB DA ', 'LTYPE': 'A', 'RID': '8', 'PERSON_NAME': 'John Smith', 'NAME': 'DA'}
{'PERSON_ATTRIBUTES': 'BC DB CB RB VC ', 'LTYPE': 'N', 'RID': '9', 'PERSON_NAME': 'Robert Smith', 'NAME': 'Robert Smith'}
{'PERSON_ATTRIBUTES': 'BC DB CB RB VC ', 'LTYPE': 'A', 'RID': '10', 'PERSON_NAME': 'Robert Smith', 'NAME': 'BC'}
{'PERSON_ATTRIBUTES': 'BC DB CB RB VC ', 'LTYPE': 'A', 'RID': '11', 'PERSON_NAME': 'Robert Smith', 'NAME': 'DB'}
{'PERSON_ATTRIBUTES': 'BC DB CB RB VC ', 'LTYPE': 'A', 'RID': '12', 'PERSON_NAME': 'Robert Smith', 'NAME': 'CB'}
{'PERSON_ATTRIBUTES': 'BC DB CB RB VC ', 'LTYPE': 'A', 'RID': '13', 'PERSON_NAME': 'Robert Smith', 'NAME': 'RB'}
{'PERSON_ATTRIBUTES': 'BC DB CB RB VC ', 'LTYPE': 'A', 'RID': '14', 'PERSON_NAME': 'Robert Smith', 'NAME': 'VC'}
{'PERSON_ATTRIBUTES': 'SA AS ', 'LTYPE': 'N', 'RID': '15', 'PERSON_NAME': 'Harvey Smith', 'NAME': 'Harvey Smith'}
{'PERSON_ATTRIBUTES': 'SA AS ', 'LTYPE': 'A', 'RID': '16', 'PERSON_NAME': 'Harvey Smith', 'NAME': 'SA'}
{'PERSON_ATTRIBUTES': 'SA AS ', 'LTYPE': 'A', 'RID': '17', 'PERSON_NAME': 'Harvey Smith', 'NAME': 'AS'}
{'PERSON_ATTRIBUTES': 'BC AS ', 'LTYPE': 'N', 'RID': '18', 'PERSON_NAME': 'Lukas Smith', 'NAME': 'Lukas Smith'}
{'PERSON_ATTRIBUTES': 'BC AS ', 'LTYPE': 'A', 'RID': '19', 'PERSON_NAME': 'Lukas Smith', 'NAME': 'BC'}
{'PERSON_ATTRIBUTES': 'BC AS ', 'LTYPE': 'A', 'RID': '20', 'PERSON_NAME': 'Lukas Smith', 'NAME': 'AS'}
我从获取 LTYPE 的索引位置开始
nameIndex=[]
attributeIndex=[]
for line in thedata:
if line['LTYPE']=='N':
nameIndex.append(int(line["RID"])-1)
if line['LTYPE']=='A':
attributeIndex.append(int(line["RID"])-1)
因此,我将每一行的列表索引归类为一个列表中的名称,并将每一行的列表索引归类为另一个列表中的属性。然后很容易将名称附加到每个观察值,如下所示
for counter, row in enumerate(thedata):
if counter in nameIndex:
row['PERSON_NAME']=row['NAME']
person_NAME=row['NAME']
if counter not in nameIndex:
row['PERSON_NAME']=person_NAME
我正在努力确定并将属性列表分配给每个人。
首先,我需要组合属于一起的属性,所以我这样做了:
newAttribute=[]
for counter, row in enumerate(thedata):
if counter in attributeIndex:
tempAttribute=tempAttribute+' '+row['NAME']
if counter not in attributeIndex:
if counter==0:
tempAttribute=""
pass
if counter!=0:
newAttribute.append(tempAttribute.lstrip())
tempAttribute=""
我的方法的一个问题是我仍然必须将最后一组添加到 newAttribute 列表中,因为循环在添加之前完成。所以要获得分组属性列表,我必须运行
newAttribute.append(tempAttribute)
但即便如此,我似乎也找不到一种干净的方法来添加我必须分两步完成的属性。首先,我创建一个字典,其中 nameIndex 位置作为键,属性作为值
tempDict={}
for each in range(len(nameIndex)):
tempdict[nameIndex[each]]=newAttribute[each]
一旦将属性放在名称行上,我就会循环浏览列表
for counter,row in enumerate(thedata):
if counter in tempDict:
thedata[counter]['TA']=tempDict[counter]
然后我再次检查它是否存在键'TA'并使用存在来设置PERSON_ATTRIBUTE键
for each in thedata:
if each.has_key('TA'):
each['PERSON_ATTRIBUTES']=each['TA']
holdAttribute=each['TA']
else:
each['PERSON_ATTRIBUTES']=holdAttribute
必须有一种更简洁的方式来考虑这个问题,所以我想知道是否有人愿意指出我可以阅读的一些函数的方向,这些函数可以让我清理这段代码。我知道我仍然必须放弃“TA”键,但我认为我已经占用了足够的空间。