2017-09-19 6 views
2

나는 Pandas groupby cumulative sum을 발견했으며 매우 유용하다고 생각했습니다. 그러나 역 누적 합계를 계산하는 방법을 결정하고 싶습니다.팬더 파이썬 Groupby 누적 합계 역방향

링크는 다음을 제안합니다.

df.groupby(by=['name','day']).sum().groupby(level=[0]).cumsum() 

합계를 반전시키기 위해 데이터 조각을 시도했지만 실패했습니다. 의견을 바탕으로, 내가 코드를 구현하고 dataframe 더 크게 만들려고 : 컬럼의 수에

import pandas as pd 
df = pd.DataFrame(
    {'name': ['Jack', 'Jack', 'Jack', 'Jill', 'Jill'], 
    'surname' : ['Jones','Jones','Jones','Smith','Smith'], 
    'car' : ['VW','Mazda','VW','Merc','Merc'], 
    'country' : ['UK','US','UK','EU','EU'], 
    'year' : [1980,1980,1980,1980,1980], 
    'day': ['Monday', 'Tuesday','Wednesday','Monday','Wednesday'], 
    'date': ['2016-02-31','2016-01-31','2016-01-31','2016-01-31','2016-01-31'], 
    'no': [10,30,50,40,40], 
    'qty' : [100,500,200,433,222]}) 
나는 다음 시도

및 그룹 만이 그룹화를 적용하지 EDIT이

df.groupby(by=['name','day']).ix[::-1, 'no'].sum().groupby(level=[0]).cumsum() 


Jack | Monday | 10 | 90 
Jack | Tuesday | 30 | 80 
Jack | Wednesday | 50 | 50 
Jill | Monday | 40 | 80 
Jill | Wednesday | 40 | 40 

.

df = df.groupby(by=['name','surname','car','country','year','day','date']).sum().iloc[::-1].groupby(level=[0]).cumsum().iloc[::-1].reset_index() 

왜 그렇습니까? 잭 마이스다와 함께 잭 존스가 폭스 바겐이있는 잭 존스와는 별도의 누적량이 될 것으로 기대합니다.

+0

@BradSolomon을, 어떻게하여 그룹을 포함하는 didnt가 쇼를 참조 불행하게도 링크. 내 업데이트 된 게시물을보고 이것이 더 명확한 지 알려주십시오 - 작업 할 때 그룹을 확보하지 못하는 것 같습니다. – Travis

답변

1

당신은 이중 iloc 사용할 수 있습니다 다른 열 솔루션의

df = df.groupby(by=['name','day']).sum().iloc[::-1].groupby(level=[0]).cumsum().iloc[::-1] 
print (df) 
       no 
name day   
Jack Monday  90 
    Tuesday 80 
    Wednesday 50 
Jill Monday  80 
    Wednesday 40 

는 간단하다 :

df = df.groupby(by=['name','day']).sum() 
df['new'] = df.iloc[::-1].groupby(level=[0]).cumsum() 
print (df) 
       no new 
name day    
Jack Monday  10 90 
    Tuesday 30 80 
    Wednesday 50 50 
Jill Monday  40 80 
    Wednesday 40 40 

편집 :

groupby에 문제가 있습니다 더 수준을 추가 할 필요가 - level=[0,1,2]을 첫 번째 그룹은 name이고 두 번째 숫자는 surname이고 세번째 숫자는 car입니다.

df1 = (df.groupby(by=['name','surname','car','country','year','day','date']) 
     .sum()) 
print (df1) 
                 no qty 
name surname car country year day  date    
Jack Jones Mazda US  1980 Tuesday 2016-01-31 30 500 
      VW UK  1980 Monday 2016-02-31 10 100 
           Wednesday 2016-01-31 50 200 
Jill Smith Merc EU  1980 Monday 2016-01-31 40 433 
           Wednesday 2016-01-31 40 222 

df2 = (df.groupby(by=['name','surname','car','country','year','day','date']) 
     .sum() 
     .iloc[::-1] 
     .groupby(level=[0,1,2]) 
     .cumsum() 
     .iloc[::-1] 
     .reset_index()) 
print (df2) 
    name surname car country year  day  date no qty 
0 Jack Jones Mazda  US 1980 Tuesday 2016-01-31 30 500 
1 Jack Jones  VW  UK 1980  Monday 2016-02-31 60 300 
2 Jack Jones  VW  UK 1980 Wednesday 2016-01-31 50 200 
3 Jill Smith Merc  EU 1980  Monday 2016-01-31 80 655 
4 Jill Smith Merc  EU 1980 Wednesday 2016-01-31 40 222 

또는 이름으로 선택 가능하다 - groupby enhancements in 0.20.1+를 참조하십시오

df2 = (df.groupby(by=['name','surname','car','country','year','day','date']) 
     .sum() 
     .iloc[::-1] 
     .groupby(['name','surname','car']) 
     .cumsum() 
     .iloc[::-1] 
     .reset_index()) 
print (df2) 

    name surname car country year  day  date no qty 
0 Jack Jones Mazda  US 1980 Tuesday 2016-01-31 30 500 
1 Jack Jones  VW  UK 1980  Monday 2016-02-31 60 300 
2 Jack Jones  VW  UK 1980 Wednesday 2016-01-31 50 200 
3 Jill Smith Merc  EU 1980  Monday 2016-01-31 80 655 
4 Jill Smith Merc  EU 1980 Wednesday 2016-01-31 40 222 
+0

감사합니다 @ jezarel -이 도움이되었지만 다른 문제가 있습니다. 제 편집 된 게시물을 보시겠습니까? – Travis

+0

@Travis - 편집 된 답변을 확인하십시오. – jezrael