2017-09-19 39 views
2

私はPandas groupby cumulative sumを見つけたので、非常に便利です。しかし、私は、逆累積合計の計算方法を決定したいと思います。パンダPython Groupby Cummulative Sum Reverse

このリンクから、以下のことが示唆されます。

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

合計を逆にするために、データをスライスしてみましたが失敗しました。

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 

編集:私は、列の数に試してみて、グループ

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]}) 

が、それはグループ化を適用するために失敗します。 フィードバックに基づいて、私はコードを実装し、データフレームを大きく作ってみました。

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

なぜですか?私は、マツダとマツダとのジャック・ジョーンズが、VWのジャック・ジョーンズとは別の累積数量になると予想しています。

+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 

EDIT:

groupbyに問題があり、より多くのレベルを追加する必要がある - level=[0,1,2]を最初にname、第2のsurnameおよび第3の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