2016-06-21 5 views
0

Ich versuche, eine Reihe von einem anderen in einem Pandas DataFrame zu subtrahieren. Vor einer numerischen Spalte habe ich mehrere Deskriptorspalten, die mich zwingen, den Index des DataFrame auf die zwei Deskriptorspalten zu setzen.Subtrahiere eine Reihe von einer anderen in Pandas DataFrame

Wenn ich dies tue bekomme ich einen KeyError auf was auch immer der erste Spaltenname in der set_index() Liste von Spalten ist. In diesem Fall ist es col_a ':

df = pd.DataFrame({'COL_A': ['A', 'A'], 
        'COL_B': ['B', 'B'], 
        'COL_C': [4, 2]}) 
df.set_index(['COL_A', 'COL_B'], inplace=True) 
df.iloc[1] = (df.iloc[1]/df.iloc[0]) 
df.reset_index(inplace=True) 


KeyError: 'COL_A' 

ich das nicht einen zweiten Gedanken nicht geben und kann nicht herausfinden, warum die KeyError ist, wie diese löst.

Antwort

0

nicht sicher, ob ich Sie richtig verstanden:

df = pd.DataFrame({'COL_A': ['A', 'A'], 
        'COL_B': ['B', 'B'], 
        'COL_C': [4, 2]}) 

gibt:

COL_A COL_B COL_C 
0  A  B  4 
1  A  B  2 

dann

df.set_index(['COL_A', 'COL_B'], inplace=True) 
df.iloc[1] = (df.iloc[1]/df.iloc[0]) 

ergibt:

COL_A COL_B  
A  B  4.0 
     B  0.5 

Wenn Sie jetzt subtrahieren wollen, sagen Zeile 0 aus Reihe 1, können Sie:

df.iloc[1].subtract(df.iloc[0]) 

zu erhalten:

COL_C -3.5 
1

die Probe Datenrahmen unten vor:

In [44]: result 
Out[44]: 
    monthyear Facility  Date  Yield Planned 
0 Dec 15  CCM2 2015-12-01 2550.000000  0.0 
1 Feb 16  CCM2 2016-02-01 4250.000000  0.0 
2 Jan 16  CCM1 2016-01-01 1540.000000  0.0 
3 Jan 16  CCM2 2016-01-01 6800.000000  0.0 
4 Nov 15  CCM1 2015-11-01 921.458157 880.0 
5 Nov 15  CCM2 2015-11-01 1750.310038 3000.0 
6 Sep 15  CCM2 2015-09-01 5191.197065 8000.0 

Um jetzt die Spalte 'Geplant' von 'Ertrag' zu subtrahieren, gehen Sie wie folgt vor:

In [45]: result['Yield']-result['Planned'] 
Out[45]: 
0 2550.000000 
1 4250.000000 
2 1540.000000 
3 6800.000000 
4  41.458157 
5 -1249.689962 
6 -2808.802935 

Wenn Sie den Unterschied in einer anderen Spalte zu speichern, dann:

In [46]: Ergebnis [ 'Difference'] = Ergebnis [ 'Ertrag'] - Ergebnis [ 'Geplante']

In [47]: result 
Out[47]: 
    monthyear Facility  Date  Yield Planned Difference 
0 Dec 15  CCM2 2015-12-01 2550.000000  0.0 2550.000000 
1 Feb 16  CCM2 2016-02-01 4250.000000  0.0 4250.000000 
2 Jan 16  CCM1 2016-01-01 1540.000000  0.0 1540.000000 
3 Jan 16  CCM2 2016-01-01 6800.000000  0.0 6800.000000 
4 Nov 15  CCM1 2015-11-01 921.458157 880.0 41.458157 
5 Nov 15  CCM2 2015-11-01 1750.310038 3000.0 -1249.689962 
6 Sep 15  CCM2 2015-09-01 5191.197065 8000.0 -2808.802935