python添加行索引,python使用基于索引的列表

本文介绍如何处理CSV文件中的数据,特别是针对包含人员姓名和属性的记录。通过识别行类型(名称或属性),作者创建了一个过程来组合每个人的所有属性,并将这些信息附加到相应的姓名记录上,从而实现数据整理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有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

必须有一个更干净的方法来考虑这个问题,所以我想知道是否有人愿意给我指出一些我可以阅读的函数的方向,这样我就可以清理代码了。我知道我还得把“助教”钥匙放下,但我想我已经占了足够的空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值