2016-12-09 85 views
2

我搜索並找到了這個接近的答案,但我不太清楚如何將它應用於我自己的情況,因爲我的參考值不存儲在同一個數據幀。在熊貓中減去每組行的不同參考值

Subtracting group specific value from rows in pandas

我有一個數據幀如下,我想減去取決於「各向同性轉變」列在其核中存在不同的參考值(在這種情況下,C和H,但原則上任何值元素週期表是可能的):

REF_H = 30 
REF_C = 180 
df 
    Atom Number Nucleus Isotropic Shift 
0    1  C   49.3721 
1    2  C   52.9650 
2    3  C   36.3443 
3    4  C   50.8163 
4    5  C   50.0493 
5    6  C   49.7985 
6    7  H   24.0772 
7    8  H   23.7986 
8    9  H   24.2922 
9   10  H   24.1632 
10   11  H   24.1572 
11   12  C   102.9401 

所以我想這回增量列,其中值是相應REF_H或Ref_C價值減去各向同性的轉變:

modifieddf.tail(2) 
    Atom Number Nucleus Isotropic Shift Delta 
10   11  H   24.1572 5.8428 
11   12  C   102.9401 77.0599 

到目前爲止,我想出最好的是這樣的:

def generateHandC(df): 
    h = df[df['Nucleus'] == 'H'] 
    h['delta'] = REF_H - h['Isotropic Shift'] 
    c = df[df['Nucleus'] == 'C'] 
    c['delta'] = REF_C - c['Isotropic Shift'] 
    return h, c 

generateHandC(df) 

Output: 
( Atom Number Nucleus Isotropic Shift delta 
6    7  H   24.0772 5.9228 
7    8  H   23.7986 6.2014 
8    9  H   24.2922 5.7078 
9   10  H   24.1632 5.8368 
10   11  H   24.1572 5.8428 
14   15  H   28.3212 1.6788 
15   16  H   28.0110 1.9890 
17   18  H   29.2324 0.7676 
18   19  H   26.7298 3.2702,  Atom Number Nucleus Isotropic Shift  delta 
0    1  C   49.3721 130.6279 
1    2  C   52.9650 127.0350 
2    3  C   36.3443 143.6557 
3    4  C   50.8163 129.1837 
4    5  C   50.0493 129.9507 
5    6  C   49.7985 130.2015 
11   12  C   102.9401 77.0599 
13   14  C   122.3188 57.6812) 

但這絕對不是最佳的,它返回的數據幀列表,並引發了我SettingWithCopyWarning。理想情況下,我想返回原始數據框和增量值的額外列。謝謝!

+0

你爲什麼不創建一個列呼叫參考值,並用正確的值填充,然後你可以增量列?如果這是一個過程的一部分,則創建添加參考值列的函數,然後計算增量,然後刪除該列。 – toasteez

回答

2

可以mapNucleus通過dict然後用。減去sub

REF_H = 30 
REF_C = 180 
d = {'C': REF_C, 'H':REF_H} 
df['Delta'] = df.Nucleus.map(d).sub(df['Isotropic Shift']) 
print (df) 
    Atom Number Nucleus Isotropic Shift  Delta 
0  0  1  C   49.3721 130.6279 
1  1  2  C   52.9650 127.0350 
2  2  3  C   36.3443 143.6557 
3  3  4  C   50.8163 129.1837 
4  4  5  C   50.0493 129.9507 
5  5  6  C   49.7985 130.2015 
6  6  7  H   24.0772 5.9228 
7  7  8  H   23.7986 6.2014 
8  8  9  H   24.2922 5.7078 
9  9  10  H   24.1632 5.8368 
10 10  11  H   24.1572 5.8428 
11 11  12  C   102.9401 77.0599 
+0

我打算使用apply,但這更好用 –

+0

感謝您的評論! – jezrael

+0

謝謝你,這工作完美,我可以看到地圖功能對我來說真的很有用! –

0
df.ix[df.Nucleus == 'H','Reference Value'] = 30 
df.ix[df.Nucleus == 'C','Reference Value'] = 180 

df['delta'] = df['Reference Value'] - df['Isotropic Shift'] 

Atom Number  Nucleus Isotropic Shift Reference Value delta 
1    C   49.3721   180.0    130.6279 
2    C   52.9650   180.0    127.0350 
3    C   36.3443   180.0    143.6557 
4    C   50.8163   180.0    129.1837 
5    C   50.0493   180.0    129.9507 
6    C   49.7985   180.0    130.2015 
7    H   24.0772   30.0    5.9228 
8    H   23.7986   30.0    6.2014 
9    H   24.2922   30.0    5.7078 
10    H   24.1632   30.0    5.8368 
11    H   24.1572   30.0    5.8428 
12    C   102.9401   180.0    77.0599