【问题标题】:Sorting csv data by a column of numerical values按一列数值对csv数据进行排序
【发布时间】:2020-09-21 00:17:39
【问题描述】:

我有一个 csv 文件,它有 10 列和大约 7,000 行。我必须根据第 4 列(0、1、2、3)对数据进行排序,我知道这是第 3 列,基于 0 的计数。该列有一个标题,该列中的数据是数值。此列中的最大值为:7548375288960,因此该行应位于我的结果的顶部。

我的代码如下。有趣的事情正在发生。如果我将 reverse=True 更改为 reverse=False,那么基于我在 Excel 中手动排序 csv 文件,打印到屏幕上的 15 行是正确的。但是当我设置 reverse=True 时,它​​们不是正确的。以下是我的打印声明中的前 4 个:

999016759.26

9989694.0

99841428.0

998313048.0

这是我的代码:

def display():
    theFile = open("MyData.csv", "r")
    mycsv = csv.reader(theFile)
    sort = sorted(mycsv, key=operator.itemgetter(3), reverse=True)
    for row in islice(sort, 15):
        print(row)

感谢任何帮助!

【问题讨论】:

  • 您是将列排序为字符串还是数字?
  • 我不太确定。我认为这就是问题所在。我想我将它们排序为字符串,但需要将它们排序为数字,不知道该怎么做
  • @Mike67,这对我很有帮助,让我朝着正确的方向前进,谢谢。

标签: python-3.x


【解决方案1】:

好的,我解决了这个问题。有几点:

  1. 列中的数据虽然只包含数值,但为字符串格式。为了克服这个问题,我在生成 csv 文件的函数中执行了以下操作。

    concatDf["ColumnName"] = concatDf["ColumnName"].astype(float)

这将所有字符串转换为浮点数。然后在我的显示功能中,我将代码的排序行更改为以下内容:

sort = sorted(reader, key=lambda x: int(float(x[3])), reverse=True)
  1. 然后我得到一个不同的错误,我意识到试图将标头从字符串转换为浮点数,这是不可能的。为了克服这个问题,我添加了以下行:

下一个(文件,无)

这是函数现在的样子:

def display():
    theFile = open("MyData.csv", "r")
    next(theFile, None)
    reader = csv.reader(theFile, delimiter = ",", quotechar='"')
    sort = sorted(reader, key=lambda x: int(float(x[3])), reverse=True)
    for row in islice(sort, 15):
        print(row)

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2022-11-12
    • 2021-09-04
    • 2011-01-07
    • 2019-08-23
    • 2013-07-10
    • 2021-05-15
    • 1970-01-01
    相关资源
    最近更新 更多