【问题标题】:Using python to find the most common value(s) in the column of CSV file使用python查找CSV文件列中最常见的值
【发布时间】:2016-03-27 12:23:51
【问题描述】:
for each in column_names:
    print each + ':'
    for L in range(1,len(row_list)):
        each_column = columns[each][L]
        for i in each_column:
            if i == i.index(i)+1:
                count+=1
                mode=i

以上代码是我尝试在 csv 文件的列中查找最常见的值。代码不完整,我已经被困了好几个小时才能做到这一点。

我对python很陌生,甚至语法对我来说都不熟悉。我们将不胜感激所有帮助。

【问题讨论】:

  • 这是一项不允许您使用collections.Counter.most_common() 的作业,还是您想要一个实际的解决方案来解决您的问题?
  • 您的代码看起来不完整(例如 count 定义在哪里?)。您可以发布带有输入、输出和预期输出的MCVE 吗?如果遇到错误,请发布完整的堆栈跟踪。
  • @TimPietzcker 是的,这是一个任务,应该开发我自己的纯 Python 数据处理实现。而且我确实想找到解决问题的方法。
  • 请显示您的数据文件的开头。我猜第一行包含标题,下面的每一行都是数据。数据是如何分离的?用逗号、制表符还是别的什么?

标签: python csv if-statement compare


【解决方案1】:

这段代码可以解决问题

  import csv
  from collections import Counter
  filename='test.csv'
  with open(filename, 'r') as f:
      column = (row[0] for row in csv.reader(f))
      print("Most frequent value: {0}".format(Counter(column).most_common()[0][0]))

首先,它会打开您的文件,然后创建一个generator expression 来检索您的 csv 中的第一列。

不将其列为列表的原因是 csv 可能很长,这可能会导致内存问题。当您使用它时,生成器会“生成”该项目。

然后它使用一个 collections.Counter 对象来计算列表中最常见的值,并获取第一个元素的值。可以一步步尝试代码,看看每一步的输出。

【讨论】:

    【解决方案2】:

    当您实际上需要分别计算每个值时,您只使用了一个 count 变量。因此,虽然您的整体方法非常好,遍历您似乎从 CSV 文件填充的字典,但您需要设置另一个字典来保存每个值的计数。由于您无法使用collections.Countercollections.defaultdict 中的任何好方法,因此您可以执行类似的操作

    counts = {}
    for each in column_names:
        count = {}
        print each + ':'
        for row in columns[each]:
            count[row] = count.get(row,0) + 1
        counts[each] = count
    

    之后,您将拥有一个字典 counts,其中每个 column_name 有一个条目,其中包含该列中的所有值作为键,它们的计数作为值。现在您只需按值对它们进行排序并输出 n 个最常见的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      • 2011-10-27
      • 1970-01-01
      相关资源
      最近更新 更多