【问题标题】:How can I read and sort a csv file in python?如何在 python 中读取和排序 csv 文件?
【发布时间】:2016-01-05 01:05:27
【问题描述】:

我是 python 新手,有一个 csv 文件,其名称和分数如下:

Andrew,10
Steve,14
Bob,17
Andrew,11

我需要知道如何读取这个文件,并且文件必须显示两个具有相同名称的条目,例如 Andrew,10 和 Andrew,11 为 Andrew,10,11。我还需要能够按名称、最高分或平均分进行排序。如果可能的话,我还希望它仅对每个名称使用最后 3 个条目。 这是我尝试用来读取和按名称排序的代码:

with open("Class1.csv", "r") as f:
        Reader = csv.reader(f)
        Data = list(Reader)
        Data.sort()
        print(Data)

【问题讨论】:

  • 你有什么尝试吗?
  • 我已经添加了我尝试使用的代码,就像我说的,我对此很陌生,在互联网上搜索并找不到解决方案。

标签: python sorting csv


【解决方案1】:

熊猫很适合它

import pandas as pd

df = pd.read_csv("<pathToFileIN>",index_col=None,header=None)
df.columns = ["name","x"]
n = df.groupby("name").apply(lambda x: ",".join([str(_) for _ in x["x"].values[-3:]])).values
df.drop_duplicates(subset="name",inplace=True)
df["x"] = n
df.sort("name",inplace=True)

df.to_csv("<pathToFileOUT>",index=None,sep=";")

【讨论】:

  • 对不起,我没有更快地回答@E.Barnes。它按名称分组,并且对于每个名称,它将所有分数附加在一起(lambda x: ",".join([str(_) for _ in x["x"].values[-3:])。然后我们放弃重复,所以我们每个名字只有一次,我们添加一个新列 (x),分数附加在一起。
【解决方案2】:

要合并分数,请使用collections.defaultdict:

scores_by_name = collections.defaultdict(list)
for row in Reader:
    name = row[0]
    score = int(row[1])
    scores_by_name[name].append(score)

要保留最后三个分数,请使用 3 项切片:

scores_by_name = {name: scores[-3:] for name, score in scores_by_name.items()}

按字母顺序迭代:

for name, scores in sorted(scores_by_name.items()):
    ... # whatever

按最高分进行迭代:

for name, scores in sorted(scores_by_name.items(), key=(lambda item: max(item[1]))):
    ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多