我在csv文件的第1列中有一个令牌列表,如图所示:
subject rate
['a','b','c'] 0.11
['a','d','c'] 0.3
['c','e'] 0.07
['f','g','h','i'] 0.18
以下是导致上述格式的代码:
reader = csv.reader(open('prom_sub.csv', 'r'))
writer = csv.writer(open('prom_token.csv', 'w', newline = ''))
stop_words = set(stopwords.words('english'))
for row in reader:
s = row[0]
r = row[1]
rm_dig = str.maketrans('','', digits)
s = s.translate(rm_dig)
tr = str.maketrans('','', string.punctuation)
tokens = nltk.word_tokenize(s.lower().translate(tr))
filtered_sentence = [w for w in tokens if not w in stop_words]
writer.writerow([filtered_sentence, r])
现在,我想将第2列中的值分配给第1列中的每个标记。也就是说,以下是我想要的结果:
subject rate
a 0.11
b 0.11
c 0.11
a 0.3
d 0.3
c 0.3
c 0.07
e 0.07
f 0.18
g 0.18
h 0.18
i 0.18
我尝试使用一个简单的for循环以所需的格式获取列1。使用python还有其他方法吗?我希望在另一个csv文件中使用prom_token.csv中的上述格式。谢谢
您的中介格式很难处理。第一个字段是字符串列表的Python表示,这不是标准格式。如果可以的话,你应该避免。
假设您别无选择,只能使用这种格式,解析它的唯一可靠方法是ast
模块中的literal_eval
,即使在极端情况下,它也会返回原始字符串列表。所以你的转换脚本可能是这样的:
with open('prom_token.csv') as fdin, open('outfile.csv', 'w', endline='') as fdout:
reader = csv.reader(fdin)
writer = csr.writer(fdout)
for row in reader:
for elt in ast.literal_eval(row[0]): # split the Python representation of a list
writer.writeline(elt, row[1])
你没有把你的代码放在这里,所以也许collections.defaultdict
会帮助你,我不确定我的代码,因为我现在的系统中没有python,我认为这样的东西会帮助你:
import csv
import collections as co
dd = co.defaultdict(list)
with open('yourCSV.csv'),'rb') as fin:
dr = csv.DictReader(fin)
for line in dr:
dd[line['subject']].append(line['rate'])