2016-12-09 9 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

あなたはsubによってmap列その後、dictによってNucleusとをsubstractことができます。

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

申し込みを利用するつもりでしたが、これははるかによかったです –

+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 
関連する問題