2016-08-02 2 views
2

私は、その日に間隔1と3がある場合、Asumが値を取得するpandasを使用して、以下のようなデータフレームを構築しようとしています。私が働いているところで最も近いのは次のようなものです:Groupby Multi Index With

しかし、私がそれを実行すると、NaumはすべてASumを返します。これを行う方法に関するアイディアは高く評価されます。

結果
     A   B  ASum 
DateTime INT                 
2016-07-05 3  4700.0  4700.0 0 
2016-07-06 1  5906.0  6830.0 0 
      3  1090.0  1090.0 6996 
2016-07-07 1  7969.0  5273.0 0 
      3  1971.0  1971.0 9940 
2016-07-08 1  3296.0  2764.0 0 
      3  1179.0  1179.0 4475 
2016-07-11 1  4993.0  5798.0 0 
      3  1325.0  1325.0 6318 

答えて

3

ここでは、INTのレベルをアンスタッキングし、その合計を取り出して積み重ねることに基づいたソリューションです。

import pandas as pd 

midx = pd.MultiIndex(levels=[['2016-07-05', '2016-07-06', '2016-07-07', 
           '2016-07-08', '2016-07-11'], [1, 3]], 
        labels=[[0, 1, 1, 2, 2, 3, 3, 4, 4], 
          [1, 0, 1, 0, 1, 0, 1, 0, 1]], 
        names=['DateTime', 'INT']) 
df = pd.DataFrame({'A': [4700.0, 5906.0, 1090.0, 7969.0, 1971.0, 
         3296.0, 1179.0, 4993.0, 1325.0], 
        'B': [4700.0, 6830.0, 1090.0, 5273.0, 1971.0, 
         2764.0, 1179.0, 5798.0, 1325.0]}, 
       index=midx) 

df = df.unstack(level='INT') 
df[('Asum', 3)] = df['A'].sum(axis=1, skipna=False) 
df = df.stack(level='INT').fillna(0) 
print(df) 

出力:

     A  B Asum 
DateTime INT       
2016-07-05 3 4700.0 4700.0  0.0 
2016-07-06 1 5906.0 6830.0  0.0 
      3 1090.0 1090.0 6996.0 
2016-07-07 1 7969.0 5273.0  0.0 
      3 1971.0 1971.0 9940.0 
2016-07-08 1 3296.0 2764.0  0.0 
      3 1179.0 1179.0 4475.0 
2016-07-11 1 4993.0 5798.0  0.0 
      3 1325.0 1325.0 6318.0 
+0

あなたのアルベルトありがとうございました!これは非常にうまく動作します!私はこれも.pct_changeで動作させるようにして遊んできましたが、運がまだありませんでした。 – BROB1

+0

あなたはそれが動作させることができない場合は、常に別の質問を投稿することができます... –

0
df['ASum'] = 0 # the new column MUST be defined ahead 

for idx,data in df.groupby(level=['DateTime']): 
    if all(x in data.index.get_level_values('INT') for x in [1,3]): 
     df.loc[idx,'ASum'].iloc[-1] = data['A'].sum() # adds the sum to the last row in the group only 

    A ASum 
DateTime INT    
2016-07-05 3 4700  0 
2016-07-06 1 5906  0 
      3 1090 6996 
2016-07-07 1 7967  0 
      3 1971 9938 
2016-07-08 1 3296  0 
      3  119 3415 
2016-07-11 1 4993  0 
      3 1325 6318 

またはを使用すると、合計はどこINT==3(必ずしも最後の行に)表示させたい場合は:

df['ASum'] = 0 

for idx,data in df.groupby(level=['DateTime']): 
    if all(x in data.index.get_level_values('INT') for x in [1,3]): 
     df.loc[(idx,3),'ASum'] = data['A'].sum() # << changed this line only 

(私はいくつかの集約的な解決策を思い付くまで)