我有一个csv文件,其中包含三列,主题,谓词,宾语 我想根据主题列值对数据进行分组,然后将其余数据作为附加到python中主题(字典)的列表添加。
per_subject = defaultdict(list)
with open("C:\\Rasha\\Nema\CODES\\DataSets\\geocoordinates-fixed.csv", mode='r') as inputfile:
reader = csv.reader(inputfile)
next(reader, None) # skip the header row
for subject, predicate, object in reader:
per_subject[subject.strip()].append([predicate.strip()])
python的编译器给出以下错误:
文件“ C:/Users/HP_Ra/PycharmProjects/ReadCSV/readCSV.py”,第10行,在 对于阅读器中的主语,谓语,宾语:ValueError:太多值无法解包(预期3)
答案 0 :(得分:9)
Pandas非常适合此任务,因为它可以为您读取csv并具有groupby
功能:
import pandas as pd
from pathlib import Path
input_file = Path("C:/Rasha/Nema/CODES/DataSets/geocoordinates-fixed.csv")
df = pd.read_csv(input_file)
# if the headers aren't right then:
# df.columns = ['subject', 'predicate', 'object']
df_per_subject = df.groupby('subject')['predicate'].agg(lambda x: list(x))
# And if you want a dict out
df_per_subject.to_dict()
请注意,如果这将是生产代码,则pandas是一个相当重的库。但是,如果您想快速解决一个临时问题,我个人认为值得这样做。
答案 1 :(得分:7)
您在数据格式上有一些不规则之处,一或多个行的值超过3。最简单的下一步是将值读入一个三元组而不是一个列表中,如果大小合适,则将其解压缩,否则将其打印出来以进行后续故障排除:
for row_num, row_list in enumerate(reader, start=1):
if len(row_list) == 3:
subject, predicate, obj = row_list
per_subject[subject.strip()].append(predicate.strip())
else:
print("unexpected row size at row", row_num, ":", row_list)