计算excel列中每个值的出现次数

时间:2018-03-20 23:53:04

标签: python excel

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

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

更新: 这是我试过的:

void print() {
    cout << ptr
}

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

有人可以帮忙吗?

4 个答案:

答案 0 :(得分:1)

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

够了。

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

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

OR

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

OR

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

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

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

在上述任何表达式中使用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 :(得分:1)

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

<强>鉴于

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)])

<强>代码

# 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

将后一代码应用于数据集。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

value_counts()包是加载Excel数据的简单方法。然后,您可以使用结果数据框的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) 成员函数。例如,

<input type="file" id="input" />