我有一个很大的excel文件,其中A列在每个单元格中都有随机数,对于该excel表格中的所有100万+行。我试图在B列中打印每个值的出现次数。通常,我在Excel本身中执行此操作,首先对数据进行排序,然后使用COUNTIF公式。但由于我有很多行(100万),所以在B列的所有行中复制粘贴公式似乎不起作用。 Excel需要永远计算并经常挂起。我想现在尝试用Python做这件事。
任何让我入门的想法都会非常感激!
更新: 这是我试过的:
void print() {
cout << ptr
}
但我得到TypeError:unhashable类型:'list'
有人可以帮忙吗?
答案 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" />