2013-03-12 63 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) 

這應該幫助你我們對您的「怪異行爲」。