2016-05-31 14 views
2

Ich habe eine dataframe und möchte zwei Spalten der vorherigen Zeile subtrahieren, vorausgesetzt, dass die vorherige Zeile den gleichen Name Wert hat. Wenn nicht, dann würde ich gerne NAN geben und mit - füllen. Mein groupby Ausdruck ergibt den Fehler TypeError: 'Series' objects are mutable, thus they cannot be hashed, der sehr mehrdeutig ist. Was vermisse ich?Subtrahieren zwei Spalten mit einer Groupby in Pandas

import pandas as pd 
df = pd.DataFrame(data=[['Person A', 5, 8], ['Person A', 13, 11], ['Person B', 11, 32], ['Person B', 15, 20]], columns=['Names', 'Value', 'Value1']) 
df['diff'] = df.groupby('Names').apply(df['Value'].shift(1) - df['Value1'].shift(1)).fillna('-') 
print df 

gewünschte Ausgabe:

 Names Value Value1 diff 
0 Person A  5  8  - 
1 Person A  13  11 -3 
2 Person B  11  32  - 
3 Person B  15  20 -21 

Antwort

2

Sie können lambda x hinzufügen und ändern df['Value']-x['Value'], ähnlich mit Value1 und letzten reset_index:

df['diff'] = df.groupby('Names') 
       .apply(lambda x: x['Value'].shift(1) - x['Value1'].shift(1)) 
       .fillna('-') 
       .reset_index(drop=True) 
print (df) 
     Names Value Value1 diff 
0 Person A  5  8 - 
1 Person A  13  11 -3 
2 Person B  11  32 - 
3 Person B  15  20 -21 

Eine andere Lösung mit DataFrameGroupBy.shift:

df1 = df.groupby('Names')['Value','Value1'].shift() 
print (df1) 
    Value Value1 
0 NaN  NaN 
1 5.0  8.0 
2 NaN  NaN 
3 11.0 32.0 
df['diff'] = (df1.Value - df1.Value1).fillna('-') 

print (df) 
     Names Value Value1 diff 
0 Person A  5  8 - 
1 Person A  13  11 -3 
2 Person B  11  32 - 
3 Person B  15  20 -21 
1

können Sie es auch tun, um diese Art und Weise:

In [76]: df['diff'] = (-df.groupby('Names')[['Value1','Value']].shift(1).diff(axis=1)['Value1']).fillna(0) 

In [77]: df 
Out[77]: 
     Names Value Value1 diff 
0 Person A  5  8 0.0 
1 Person A  13  11 -3.0 
2 Person B  11  32 0.0 
3 Person B  15  20 -21.0 
Verwandte Themen