我有一个很大的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 回答
考虑使用pandas,它易于使用并针对大型数据集进行了优化 .
Given
为了演示,这里是一个csv文件,其中包含一列随机数:
Code
产量
将后一个代码应用于数据集 .
首先提出一些建议:你的问题有正确的内容,但措辞很差 . 我正在回答它,因为前者,但我觉得有必要指出后者,所以你可以避免在未来获得如此多的亲密选票 . “任何让我入门的想法都会非常感激!”和“任何人都可以帮忙?”不是SO的有效问题 . 这里的问题是,它们是真正的问题,而且大多数评论者会将它们视为触发短语 . 在你的情况下,你实际上有一个很好的明确的问题陈述,一个几乎是现场的编码尝试,你需要的只是帮助一个特定的例外 . 下一次,将您的问题说成是关于您的错误或实际问题,并远离模糊,如“你能帮忙吗?” .
够了 .
CSV读取器可以在CSV行上进行迭代 . 每行都是一个列表 . 因此,当您执行
list(reader)
时,实际上是在创建列表列表 . 在您的情况下,每个列表只包含一个元素,但这与Counter
无关:列表不能是字典键,因此您将获得异常 . 字面上你需要改变的是在将每行传递给_609747之前提取每一行的第一个元素 . 将my_list = list(reader)
替换为以下任何一项:要么
要么
最后一个创建一个将被懒惰地评估的生成器表达式 . 对于非常大的输入,它可能是您的最佳选择,因为它不会将整个数据集保留在内存中,只保留直方图 .
由于生成器是惰性计算的,因此无法评估
with
块之外的Counter
. 如果您尝试这样做,文件将已经关闭,并且生成器将在第一次迭代时引发错误 .通过在上面的任何表达式中使用
operator.itemgetter
而不是显式r[0]
,您可能会获得轻微的速度提升 . 所有组合,下面的示例非常接近您已有的:您可以在Python中使用相同的策略:将整个数字序列读入列表,对列表进行排序并计算重复数 .
pandas
包是加载Excel数据的简单方法 . 然后,您可以使用结果数据帧的value_counts()
成员函数 . 例如,