首页 文章

计算excel列中每个值的出现次数[关闭]

提问于
浏览
0

我有一个很大的excel文件,其中列A在每个单元格中有随机数,对于那个excel表中的所有100万行 . 我试图在B列中打印每个值的出现次数 . 通常,我在Excel中进行此操作,首先对数据进行排序,然后使用COUNTIF公式 . 但由于我有这么多行(100万),所以在B列的所有行中复制粘贴公式似乎不起作用 . Excel需要永远计算并经常挂起 . 我想现在尝试使用Python .

任何让我入门的想法都将非常感激!

更新:这是我尝试过的:

import csv
import collections
with open ('test.csv','rb') as f:
    reader = csv.reader(f)
    my_list = list(reader)

#print my_list[1000]
counter = collections.Counter(my_list)
print counter

但我得到TypeError:unhashable类型:'list'

有人可以帮忙吗?

4 回答

  • 1

    考虑使用pandas,它易于使用并针对大型数据集进行了优化 .

    Given

    import csv
    import random
    
    import pandas as pd
    

    为了演示,这里是一个csv文件,其中包含一列随机数:

    random.seed(123)
    data = [random.randint(0, 100) for _ in range(25)]
    
    # Write data to csv
    filename = "discard.csv"
    with open(filename, "w+") as f:
        writer = csv.writer(f)
        for row in data:
            writer.writerow([str(row)])
    

    Code

    # Read and count
    s = pd.read_csv(filename, header=None, index_col=False)[0]
    s.value_counts()
    

    产量

    34    2
    20    2
    6     2
    71    2
    43    2
    42    2
    98    1
    11    1
    99    1
    4     1
    13    1
    31    1
    48    1
    17    1
    52    1
    55    1
    68    1
    89    1
    0     1
    Name: 0, dtype: int64
    

    将后一个代码应用于数据集 .

  • 0

    首先提出一些建议:你的问题有正确的内容,但措辞很差 . 我正在回答它,因为前者,但我觉得有必要指出后者,所以你可以避免在未来获得如此多的亲密选票 . “任何让我入门的想法都会非常感激!”和“任何人都可以帮忙?”不是SO的有效问题 . 这里的问题是,它们是真正的问题,而且大多数评论者会将它们视为触发短语 . 在你的情况下,你实际上有一个很好的明确的问题陈述,一个几乎是现场的编码尝试,你需要的只是帮助一个特定的例外 . 下一次,将您的问题说成是关于您的错误或实际问题,并远离模糊,如“你能帮忙吗?” .

    够了 .

    CSV读取器可以在CSV行上进行迭代 . 每行都是一个列表 . 因此,当您执行 list(reader) 时,实际上是在创建列表列表 . 在您的情况下,每个列表只包含一个元素,但这与 Counter 无关:列表不能是字典键,因此您将获得异常 . 字面上你需要改变的是在将每行传递给_609747之前提取每一行的第一个元素 . 将 my_list = list(reader) 替换为以下任何一项:

    my_list = list(r[0] for r in reader)
    

    要么

    my_list = [r[0] for r in reader]
    

    要么

    counter = collections.Counter(r[0] for r in reader)
    

    最后一个创建一个将被懒惰地评估的生成器表达式 . 对于非常大的输入,它可能是您的最佳选择,因为它不会将整个数据集保留在内存中,只保留直方图 .

    由于生成器是惰性计算的,因此无法评估 with 块之外的 Counter . 如果您尝试这样做,文件将已经关闭,并且生成器将在第一次迭代时引发错误 .

    通过在上面的任何表达式中使用 operator.itemgetter 而不是显式 r[0] ,您可能会获得轻微的速度提升 . 所有组合,下面的示例非常接近您已有的:

    import csv
    from collections import Counter
    from operator import itemgetter
    
    with open ('test.csv','rb') as f:
        reader = csv.reader(f)
        g = itemgetter(0)
        counter = Counter(g(r) for r in reader)
    print(counter)
    
  • 1

    您可以在Python中使用相同的策略:将整个数字序列读入列表,对列表进行排序并计算重复数 .

  • 0

    pandas 包是加载Excel数据的简单方法 . 然后,您可以使用结果数据帧的 value_counts() 成员函数 . 例如,

    import pandas as pd
    xl = pd.ExcelFile("C:\\Temp\\test.xlsx") # or whatever your filename is
    df = xl.parse("Sheet1", header=None)
    answer = df[0].value_counts()
    print(answer)
    

相关问题