2013-03-12 222 views
1

我是Python的新手,对于这个问题我有很多麻烦,这是我必须要做的工作。使用python在excel中计算值

关于excel文件的一些背景知识:有3列,约100行。第一列(col1)包含A或B.第二列(col2)包含范围从1到10的任何数字。第三列(col3)包含任何十进制数的值。

我希望程序要做的就是解析数据。 col1和col2会有很多重复的部分放在一起。例如,(A,1)可以位于第1,5,20,98行等,但是col3将是不同的数字。所以对于第三栏的不同数字,我希望它找到所有这些数字的平均值。

输出应该是这个样子:

A, 1 = avg 4.32 
A, 2 = avg 7.23 
A, 3 = avg -9.12 
etc etc (until number 10) 
B, 1 = avg 3.76 
B, 2 = avg -8.12 
B, 3 = avg 1.56 
etc etc (until number 10) 

它并不一定要在完全字母和数字顺序,它可以只打印出它找到的第一个连击。但我已经做了这个至今在我的代码,以及由于某种原因,它不会打印出所有的连击,只有3个

import xlrd #import package 

#opening workbook and reading first sheet 
book = xlrd.open_workbook('trend.xls') 
sheet = book.sheet_by_index(0) 

#function to hold unique combos 
unique_combinations = {} 

#looping through data 
for row_index in range(sheet.nrows): 
    #declaring what group equals to what row 
    col1 = sheet.cell(row_index, 0) 
    col2 = sheet.cell(row_index, 1) 
    col3 = sheet.cell(row_index, 2) 

    unique_combo = (col1.value, col2.value) 

    if unique_combinations.has_key(unique_combo): 
     unique_combinations[unique_combo].append(col3.value) 
    else: 
     unique_combinations[unique_combo] = [col3.value] 

for k in unique_combinations.keys(): 
    l = unique_combinations[k] 
    average = sum(l)/len(l) 
    print '%s: %s Mean = %s' % (k[0], k[1], average) 

从本质上讲,它基本上是2组,2组内是另一个10组,并在这10组是那里的数字的平均值。

请帮忙!提前谢谢你。 Excel文件

示例:

col1 | col2 | col3 
A | 1 | 3.12 
B | 9 | 4.12 
B | 2 | 2.43 
A | 1 | 9.54 
B | 8 | 2.43 
A | 2 | 1.08 

那么什么程序需要做的是看到它后面的第一个组合是A,1,它就会储存3.12名单,并期待在然后继续存储,直到遇到重复的是第四行。它也会存储这个值。在结尾处,输出将显示A,1 = avg(3.12 + 9.54/2)。此示例仅显示A,1组合。但实际上,只有2个组(如示例),但col2的范围可以从1到10.将会有很多重复项。

+1

它需要在Python中完成吗? Excel完全可以自己做到这一点...... – Floris 2013-03-12 22:15:41

+0

您能否以表格格式发布小样本并添加您想要的输出。 – root 2013-03-12 22:15:42

+0

说实话,我说过同样的话。 Excel可以自己完成所有工作。但我的老板想要一个计划。我认为他是一个noob在它..但我一直使用C和C + +,并通过这些语言打开Excel文件似乎更繁琐。所以我选择了python。 我将编辑帖子并放置一个excel样本。 – chakolatemilk 2013-03-12 22:20:51

回答

1

pandas一试:

In [1]: import pandas as pd 

In [2]: xls = pd.ExcelFile('test.xls') 
    ...: df = xls.parse('Sheet1', header=None) 
    ...: 

In [3]: df 
Out[3]: 
    0 1  2 
0 A 1 3.12 
1 B 9 4.12 
2 B 2 2.43 
3 A 1 9.54 
4 B 8 2.43 
5 A 2 1.08 

In [4]: groups = df.groupby([0,1]) 

In [5]: for k, g in groups: 
    ...:  print k, g[2].mean() 
    ...:  
(u'A', 1.0) 6.33 # your example (3.12 + 9.54)/2 
(u'A', 2.0) 1.08 
(u'B', 2.0) 2.43 
(u'B', 8.0) 2.43 
(u'B', 9.0) 4.12 

如果您希望您的所有手段的清单,完整的脚本是:

import pandas as pd 
df = pd.ExcelFile('test.xls').parse('Sheet1', header=None) 
print [g[2].mean() for _, g in df.groupby([0,1])] 
# out: [6.3300000000000001, 1.0800000000000001, 2.4300000000000002, 2.4300000000000002, 4.1200000000000001] 
+0

我不想在python脚本中一个一个地插入单元格的值。有超过100行。 – chakolatemilk 2013-03-12 23:13:22

+0

@chakolatemilk - 你是什么意思? 'pandas'让我们读/写excel文件:S – root 2013-03-12 23:14:48

+0

OHhhh,我正在阅读Out [3]作为python脚本的一部分 – chakolatemilk 2013-03-12 23:15:28

1

这个建议是更多的“如何工作发生了什么事情开“,并且在回答中比阅读评论更容易阅读。

我认为值得添加调试打印和异常处理。

我尝试了OpenOffice和Python 2.7的示例。如果在最后一个循环中发生异常,并且我在测试运行中吞食stderr,我可以重现您的症状。例如:python test.py 2>nul

所以我建议你试试这个:


    import xlrd 
    book = xlrd.open_workbook('trend.xls') 
    sheet = book.sheet_by_index(0) 
    unique_combinations = {} 
    for row_index in range(sheet.nrows): 
     col1 = sheet.cell(row_index, 0) 
     col2 = sheet.cell(row_index, 1) 
     col3 = sheet.cell(row_index, 2) 

     unique_combo = (col1.value, col2.value) 
     if unique_combinations.has_key(unique_combo): 
      print 'Update: %r = %r' % (unique_combo, col3.value) 
      unique_combinations[unique_combo].append(col3.value) 
     else: 
      print 'Add: %r = %r' % (unique_combo, col3.value) 
      unique_combinations[unique_combo] = [col3.value] 

    for k in unique_combinations.keys(): 
     l = unique_combinations[k] 
     try: 
      average = sum(l)/len(l) 
      print '%s: %s Mean = %s' % (k[0], k[1], average) 
     except Exception, e: 
      print 'Ignoring entry[%r]==%r due to exception %r' % (k, l, e) 

这应该帮助你我们对您的“怪异行为”。