我有一个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()])
Run Code Online (Sandbox Code Playgroud)
python的编译器给出以下错误:
文件“ C:/Users/HP_Ra/PycharmProjects/ReadCSV/readCSV.py”,第10行,用于读者中的主题,谓词和对象:ValueError:太多值无法解包(预期3)
Dan*_*Dan 10
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()
Run Code Online (Sandbox Code Playgroud)
请注意,如果这将是生产代码,则pandas是一个相当繁重的库。但是,如果您想快速解决一个临时性问题,我个人认为值得一试。
数据格式有些不规则,一或多个行的值超过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)
Run Code Online (Sandbox Code Playgroud)