使用python根据csv中的列进行分组

时间:2019-06-18 16:08:25

标签: python csv

我有一个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)

2 个答案:

答案 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)