2015-11-11 114 views
-1

我有一個數據集,我閱讀:通過數據幀循環行添加到列大熊貓蟒蛇

import pandas as pd 
data = pd.read_excel('.../data.xlsx') 

的內容是這樣的:

Out[57]: 
     Block Concentration   Name  value 
      1   100   GlcNAc2  321 
      1   100   GlcNAc2  139 
      1   100   GlcNAc2  202 
      1   33   GlcNAc2  86 
      1   33   GlcNAc2  194 
      1   33   GlcNAc2  452 
      1   100   BCC   345 
      1   100   BCC   6 
      1   100   BCC   34 
      1   33    BCC   11 
      1   33    BCC   53 
      1   33    BCC   87 
      1   0  Print buffer  127 
      1   0  Print buffer  55 
      1   0  Print buffer  67 


...  ...   ...    ...  ...    ... 

     24    0  Print buffer  -9968 
     24    0  Print buffer  -4526 
     24    0  Print buffer  14246 
  1. 我想每個塊和名稱,添加三個'0'濃度並將來自該塊的3'打印緩衝區'值添加到這三個新的'0'濃度。

    Out[57]: 
        Block Concentration   Name  value 
         1   0    GlcNAc2  127 
         1   0    GlcNAc2  55 
         1   0    GlcNAc2  67 
         1   100   GlcNAc2  321 
         1   100   GlcNAc2  139 
         1   100   GlcNAc2  202 
         1   33   GlcNAc2  86 
         1   33   GlcNAc2  194 
         1   33   GlcNAc2  452 
         1   0    BCC   127 
         1   0    BCC   55 
         1   0    BCC   67 
         1   100   BCC   345 
         1   100   BCC   6 
         1   100   BCC   34 
         1   33    BCC   11 
         1   33    BCC   53 
         1   33    BCC   87 
         1   0  Print buffer  127 
         1   0  Print buffer  55 
         1   0  Print buffer  67 
    

    ... ... ... ... ... ...

     24    0  Print buffer  -9968 
        24    0  Print buffer  -4526 
        24    0  Print buffer  14246 
    
  2. 計算3 '打印緩衝器' 的平均和中減去通過從每一個值同一塊。

    期望的輸出:

    Out[57]: 
        Block Concentration   Name  value   newvalue 
         1   0    GlcNAc2  127   127-mean(127+55+67) 
         1   0    GlcNAc2  55    55 -mean(127+55+67) 
         1   0    GlcNAc2  67    67-mean(127+55+67) 
         1   100   GlcNAc2  321   321-mean(127+55+67) 
         1   100   GlcNAc2  139    139-mean(127+55+67) 
         1   100   GlcNAc2  202   .... 
         1   33   GlcNAc2  86 
         1   33   GlcNAc2  194 
         1   33   GlcNAc2  452 
         1   0    BCC   127 
         1   0    BCC   55 
         1   0    BCC   67 
         1   100   BCC   345 
         1   100   BCC   6 
         1   100   BCC   34 
         1   33   BCC   11 
         1   33   BCC   53 
         1   33   BCC   87 
         1   0  Print buffer  127 
         1   0  Print buffer  55 
         1   0  Print buffer  67 
    
    ...  ...   ...    ...  ...    ... 
    
        24    0  Print buffer  -9968 
        24    0  Print buffer  -4526 
        24    0  Print buffer  14246 
    

    僞代碼:

    for each block 
        for each Name 
        add concentration '0' three times 
        append the three values of 'print buffer' to the three '0' concentrations 
        newvalue = value - average(three print buffer) 
    
+0

我的新職位@Andy海登:) – Jessica

+0

@Parfait請看我在這裏的新職位 – Jessica

+0

你有幾個問題在這裏。第一個涉及從一個子集重新填充數據框。另一個更多的計算問題涉及到「for」循環,而不是「groupby」和「transform」(或「apply」)操作。我建議把它分成兩個單獨的問題。 –

回答

1

考慮使用groupby apply functions到數據集。第一個函數僅使用mean()對「打印緩衝區」的值進行平均,而將其他文件保留爲零。然後第二個功能最大化meanvalue。最後,簡單地創建newvalue的算術差:

def add_mean_value(mgrp): 
    mgrp['meanvalue'] = mgrp[mgrp['Name'] == 'Print buffer']['value'].mean()  
    return mgrp 
data = data.groupby(['Block', 'Concentration', 'Name']).apply(add_mean_value)  

def max_sum_value(mgrp):  
    mgrp['meanvalue'] = mgrp['meanvalue'].max()  
    return mgrp 
data = data.groupby(['Block']).apply(max_sum_value) 

data['newvalue'] = data['value'] - data['meanvalue'] 
print(data) 

輸出

Block Concentration   Name value meanvalue newvalue 
0  1   100  GlcNAc2 321   83  238 
1  1   100  GlcNAc2 139   83  56 
2  1   100  GlcNAc2 202   83  119 
3  1    33  GlcNAc2  86   83   3 
4  1    33  GlcNAc2 194   83  111 
5  1    33  GlcNAc2 452   83  369 
6  1   100   BCC 345   83  262 
7  1   100   BCC  6   83  -77 
8  1   100   BCC  34   83  -49 
9  1    33   BCC  11   83  -72 
10  1    33   BCC  53   83  -30 
11  1    33   BCC  87   83   4 
12  1    0 Print buffer 127   83  44 
13  1    0 Print buffer  55   83  -28 
14  1    0 Print buffer  67   83  -16 
+0

謝謝你這是有幫助的。你能幫助我更好地理解嗎? sumvalue的第一部分是總結每個塊的「打印緩衝區」值。什麼是max_sum_value部分?它是否只返回最大值?在哪裏取3個'打印緩衝區'的平均值並從每個值中減去這部分?謝謝!經過試驗和錯誤後,我終於明白了 – Jessica

+0

!取平均值:'sgrp ['sumvalue'] = sgrp [sgrp ['Name'] =='Print buffer'] ['value']。mean()'和其餘幾乎相同。再次感謝@Parfait的幫助! – Jessica

+0

道歉,我查看了你想要的結果,並沒有看到平均值。是的,儘管在文中提到它,但可以使用「mean()」而不是「sum()」。 – Parfait