【问题标题】:how do i sort data from a csv file numerically in python如何在python中对csv文件中的数据进行数字排序
【发布时间】:2016-01-15 07:24:03
【问题描述】:

我正在编写一个程序,该程序从 csv 文件中获取学生的分数,然后需要对分数从高到低进行排序。 csv 文件如下所示:

乔希 12
约翰 6
弗雷德 8
哈利 7

我尝试将这些项目放在这样的列表中:

 Mylist=[]
csvfile = open (classname,'r')
reader = csv.reader(csvfile)
for row in reader:
    Mylist.append(row)

然后反转列表以将数值放在第一位:

Mynewlist = []
    for each in Mylist:
        value2 = ''.join(each[0])
        value1 = ''.join(each[1])
        mynewlist.append(value1,value2)

没有运气,我得到了这个错误:

    Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    main()
  File "\\SRV-FILE3\ca231$\task 3\3.py", line 143, in main
    value1 = ''.join(each[1])
IndexError: list index out of range

我使用''.join(each[1]) 转换为字符串,然后以相反的顺序附加它们,然后我计划使用.sort() 对它们进行数字排序,但我无法将它们附加到列表中。

有人知道如何按数值对 csv 文件的内容进行排序吗?

【问题讨论】:

  • 建议大家看看pandas库pandas.pydata.org
  • 我猜你最好使用字典而不是列表
  • @skywavemedia 你的程序有很多问题首先正确缩进它 secong 列表索引从 0 而不是 1 开始,你在哪里排序
  • @VigneshKalai 感谢我在这里错误地输入了 1 和 2,缩进似乎也可以正常工作
  • @skywavemedia 乐于帮助我说的是缩进,而不是你的程序。所以如果输入 0 和 1 并且索引超出范围错误,我认为你没有两个元素在你的 csv 文件中检查完整的 csv

标签: python list sorting csv numerical


【解决方案1】:

我认为你把事情复杂化了。假设您将数据作为列表列表:

data = [("josh", "12"), ("john", "6"), ("fred", "8"), ("harry", "7")]

这当然可以来自 CSV,与排序无关。只需调用sorted()即可排序:

sorted(data, key = lambda x: int(x[1]))

lambda 是一个函数,它选择每个子列表的第二个元素作为键,即分数,并将其转换为数字进行排序。这打印:

[('john', '6'), ('harry', '7'), ('fred', '8'), ('josh', '12')]

【讨论】:

  • 当数值实际上是字符串时,不会按预期工作 - 从文本文件中读取时会出现这种情况。
  • 为 lambda 点赞!
【解决方案2】:

如果您的 CSV 包含的所有内容都是名称和数字,并且您的名称是唯一的,那么

  1. 将 CSV 内容存储为 {name:score} 作为字典
  2. 使用下面的代码根据值进行排序(在您的情况下为分数)

    import operator
    
    x = {"josh": 12, "john": 6, "fred": 8, "harry": 7,}
    
    sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))
    

【讨论】:

    【解决方案3】:

    您可以这样做:(根据您的值创建字典)

    for row in reader:
        my_dict = {row[0]:row[1]}
    

    然后您可以对已排序的字典进行表示(字典本质上是无序的,因此这将是一个列表):

    import operator
    sorted_dict = sorted(my_dict.items(), key=operator.itemgetter(1))
    

    值得注意的是,有更好/更简单的方法可以做到这一点(例如 Panda),但至少你学到了不同的方法 :)

    【讨论】:

    • from collections import SortedDict... :)
    • @DavidZemens 不是 SortedDict 只记住添加元素的顺序吗?您仍然需要评估它们
    • 当然,我只是在评论 is 一种字典类型,它保持排序,以防它对 OP(或其他可能不熟悉它的人)有用.
    【解决方案4】:
    from operator import itemgetter
    result = []
    with open("data", 'r') as f:
            r = csv.reader(f, delimiter=' ')
            # next(r, None)  # skip the headers
            for row in r:
                result.append(row[:-1])
    # sort by numeric part, which is a key value for sorted.
    # itemgetter(1) gets the number in each sublist
    print(sorted(result,key=itemgetter(1)))
    
    [['josh', '12'], ['john', '6'], ['harry', '7'], ['fred', '8']]
    

    【讨论】:

      【解决方案5】:

      您可以为此使用pandas

      import pandas as pd
      
      df = pd.read_csv('students.csv', header=None)
      df.columns = ['Name', 'Score']
      df.sort('Score', ascending=False, inplace=True)
      

      最后,你会得到一个如下所示的数据框:

          Name  Score
      0   josh     12
      2   fred      8
      3  harry      7
      1   john      6
      

      代码正在读取您的 CSV 文件,并明确说明没有标题。默认情况下,pandas 假定第一行包含列标题。由于没有任何标题,因此我们添加:NameScore。最后,我们根据Score 列进行就地排序。您可以通过删除 inplace= 参数并执行以下操作来保持原始数据框不变:

      sorted_df = df.sort('Score', ascending=False)
      

      在这一行之后,您的原始文件位于 df 中,排序后的文件位于 sorted_df

      【讨论】:

        【解决方案6】:

        如果csv 文件中的data 如下所示:

        josh 12
        john 6
        fred 8
        harry 7
        

        然后你可以创建一个dictionary并使用key=d.__getitem__

        import csv
        with open('yourfile.csv', 'rb') as f:
            reader = csv.reader(f)
            d = {}
            for row in f:
                row = row.split(",")
                d[row[0]]=int(row[1]) 
        k = sorted(d, key=d.__getitem__, reverse=True)
        v = sorted(d.values(), reverse=True)
        sorted_d = zip(k,v)
        print (sorted_d)
        

        输出:

        [('josh', 12), ('fred', 8), ('harry', 7), ('john', 6)]
        

        【讨论】:

          猜你喜欢
          • 2017-10-08
          • 2021-04-30
          • 2015-05-24
          • 2018-12-17
          • 2016-04-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-14
          • 2022-01-15
          相关资源
          最近更新 更多