2015-04-29 56 views
1

我有一个csv文件,其中包含100,000个IQ值。智商的范围从34-165,所以显然会有很多数字是相同的。我正在尝试编写能够告诉我有多少数字相同的代码。例如:有11个智商为49的人,120个智商为62的人。我认为使用列表最简单,但我是初学者,仍在学习。所以只是想知道哪些代码块能够计算出来?计算某个特定数字在csv文件中的数量

+0

什么是CSV文件的结构? –

+0

这样做的最简单方法是安装/使用R.这是R中的几行,或者您是否有必须使用的特定语言? – BadZen

+0

这可能是一些不错的在bash中使用''cut' /'sed','sort'和'uniq -c';} – tmp

回答

2

您的问题整齐地分成两部分:读取csv并处理结果。

如果您提供了关于csv的更多信息,或者到目前为止尝试过的代码示例,那么Stack Overflow的优秀人员将会更加轻松,但我们仍然可以尝试使用我们的有。

对于在CSV阅读,从这里开始: https://docs.python.org/2/library/csv.html

如果CSV是逗号分隔的号码列表(120,62,37 ...),这是一个非常简单的操作。如果它有更多的信息(例如,如果每行都是“姓名,年龄,性别,智商,出生国......”),它需要多一点工作,但仍然很容易实现。

我首先假设你的文件是一个简单的数字列表,用逗号分隔。

这样:

import csv 
with open('yourfile.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    for row in reader: 
     # there is only one row! 
     # it is a list of numbers (as string values) 
     # ie, ['34','35','120','91'...] 
     for x in xrange(34,166): 
      # x starts at 34, and iterates to 166-1 = 165 
      print x, row.count(str(x)) 
      # 'str(x)' converts the int to a string 
      # 'count' counts the number of times that string is present in the list 'row' 

您也可以在值添加到字典中供以后使用:代替print语句,定义一个字典 - “IQS = {}” 和:

iqs[x] = row.count(str(x)) 

iqs[120] 
10 #output 

将其组合在一起(删除评论):

现在你可以随意收回你的价值观

import csv 
with open('yourfile.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    iqs= {} 
    for row in reader: 
     for x in xrange(34,166): 
      iqs[x] = row.count(str(x)) 

如果CSV是更复杂,你可以做两个循环,第一解析CSV(即创建一个列表,而不是“行”),并从34至165第二迭代:

import csv 
with open('yourfile.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    lst= [] 
    for row in reader: 
     #parse row 
     lst.append(iq_value_from this row) 
    iqs= {} 
    for x in xrange(34,166): 
     iqs[x] = lst.count(str(x)) 

最后,如果您希望绘制结果,它可能是创建两个列表更加有用,并与matplotlib包(http://matplotlib.org/users/pyplot_tutorial.html

import csv 
import matplotlib.pyplot as plt 
with open('yourfile.csv', 'r') as csvfile: 
    reader = csv.reader(csvfile, delimiter=',') 
    lst = [] 
    x_values= [] 
    y_values=[] 
    for row in reader: 
     #parse row 
     lst.append(iq_value_from this row) 
    iqs= {} 
    for x in xrange(34,166): 
     x_values.append(x) 
     y_values.append(lst.count(str(x))) 

plt.plot(x_values,y_values) 
plt.show() 
+1

由于某种原因,我虽然你说你使用的是python,但实际上你没有指定语言....哦。这里是一个python解决方案.... – codeMonkey

+0

对不起,我最后在评论中指定了。谢谢你的帮助。 –

1

至于至极类型的集合使用的绘制出来,一世 建议使用通用字典,使用IQ值作为关键字,总和作为值。阅读您的CSV并增加每个智商的价值。

您可以用每个有效的IQ值预填充Dictionary或在运行中添加条目,检查给定IQ是否存在Dictionary条目,然后添加或增加它。

对于较大的问题或面临性能问题时,您可以使用具有足够元素的Int32数组到也许让所有有效的IQ值,计算指数为:

int[] Sums = new int[100]; 
// Loop this over your CSV 
int IQ = 120; 
Sums[IQ - 50]++; 
相关问题