2016-05-31 2 views
2

나는 이전 행의 두 열을 뺍니다. Name의 값을 가지면 dataframe이고 이전 행의 두 열을 뺍니다. 그렇지 않으면 NAN을 산출하고 -으로 채우기를 원합니다. 내 groupby 표현식은 매우 모호한 TypeError: 'Series' objects are mutable, thus they cannot be hashed 오류를 생성합니다. 내가 뭘 놓치고 있니?팬더에서 Groupby가있는 두 개의 열 빼기

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 

원하는 출력 :

 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 

답변

2

당신은 lambda x를 추가하고 Value1 지난 reset_index와 유사한 x['Value']-df['Value']을 변경할 수 있습니다

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 

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

:

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