我有csv文件中的数据。其中一列列出一个人的姓名,该列后面的所有行都提供有关该人的一些描述性属性,直到下一个人的姓名出现为止。我可以通过ltype列判断行何时有名称或属性,该列中的n表示该行中的name值实际上是一个名称,该列中的a表示name列中的数据是一个属性。属性是编码的,我有60万行数据。这是一个样品。将对数据进行分组,并通过将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)
但即便如此,我似乎也找不到一个干净的方法来添加我必须分两步完成的属性。首先,我创建一个字典,名称索引位置作为键,属性作为值
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_属性密钥
for each in thedata:
if each.has_key('TA'):
each['PERSON_ATTRIBUTES']=each['TA']
holdAttribute=each['TA']
else:
each['PERSON_ATTRIBUTES']=holdAttribute
必须有一个更干净的方法来考虑这个问题,所以我想知道是否有人愿意给我指出一些我可以阅读的函数的方向,这样我就可以清理代码了。我知道我还得把“助教”钥匙放下,但我想我已经占了足够的空间。