我有一个TSV(制表符分隔文件),其中一个标题称为session_id。我还有一个名为myMap的映射,其中键是session_id,值是会话长度。现在我想要的是修改tsv文件,以便我在末尾添加一个名为“Length”的标题,并在那里添加长度值。这意味着对于每一行,我应该将session_length作为另一个制表符分隔值附加到每行的末尾。 例如,如果我的TSV文件的第一行最初看起来像这样:
User_id Session_id Age Date
23 'adasd5' 23 23/02/2017
我也有:
myMap['adasd5']=12
因此,文件应更改为:
User_id Session_id Age Date Length
23 'adasd5' 23 23/02/2017 12
这是我做的,但它不起作用:
with open('file.tsv', 'r+b') as infile:
header=infile.next()
h=header+'\t'+"return"+'\n'
infile.write(h)
for line in infile:
line2 = line.strip().split('\t')
if line2[1] in myMap:
d=line+'\t'+str(myMap[line2[1]])+'\n'
infile.write(d)
infile.close()
答案 0 :(得分:1)
我通过询问朋友(@Babak)找到答案。
以下是答案:
df=pd.read_csv('file.tsv', sep='\t',names=["User_id","Session_id","Age","Date"])
df['Length']=df.session_id.apply(lambda x:myMap[x])
答案 1 :(得分:0)
虽然大熊猫会让这变得轻而易举,但是好的'Python可以做得很好。你在tsv输入文件中的Session_id值周围有单引号,因此output.append代码行有一个.replace()方法来摆脱字典查找。
否则你只是在文件中加载,指定tab作为分隔符,跳过标题行,并将文件的其余部分摄取到列表列表中。
然后迭代这个列表,将myMap查找的结果追加到最后。输出新标题并将输出数据写入文件。
import csv
with open('file.tsv', newline='') as f:
f.readline()
reader = csv.reader(f, delimiter='\t')
data = list(reader)
output = []
myMap = {
'adasd5': 12,
}
for line in data:
user_id, session_id, age, date = line
output.append([user_id, session_id, age, date, myMap[session_id.replace("'", '')]])
with open('output.tsv', 'w', newline='') as f:
headers = ['User_id', 'Session_id', 'Age', 'Date', 'Length']
writer = csv.writer(f, delimiter='\t')
writer.writerow(headers)
writer.writerows(output)