2017-05-30 3 views
2

ここに示す例のデータは http://pandas.pydata.org/pandas-docs/stable/groupby.htmlです。小見出しに移動します。ウィンドウの新しい構文と操作の再サンプリング構文の最適化を広げるパンダスグループ

コマンドプロンプトで、新しい構文は、pandasのマニュアルのように機能します。しかし、私は、保存されたプログラムで実行されるように、既存のデータフレームに拡張されたデータを含む新しい列を追加したい。

はGROUPBY拡大コードに構文をアップグレードする前に、私は、以下の1行のコードを使用することができました:

df = pd.DataFrame({'A': [1] * 10 + [5] * 10, 'B': np.arange(20)}) 
df['Sum of B'] = df.groupby('A')['B'].transform(lambda x: pd.expanding_sum(x)) 

これは、期待される結果が得られますが、だけでなく、「expanding_sumが推奨されていません」というメッセージを与えます。期待される結果は次のとおりです。

A B Sum of B 
0 1 0   0 
1 1 1   1 
2 1 2   3 
3 1 3   6 
4 1 4  10 
5 1 5  15 
6 1 6  21 
7 1 7  28 
8 1 8  36 
9 1 9  45 
10 5 10  10 
11 5 11  21 
12 5 12  33 
13 5 13  46 
14 5 14  60 
15 5 15  75 
16 5 16  91 
17 5 17  108 
18 5 18  126 
19 5 19  145 

廃止予定の構文を置き換えるには、新しい構文を使用します。私は新しい構文をしようとすると、私はエラーメッセージが表示されます:

df['Sum of B'] = df.groupby('A').expanding().B.sum() 

TypeError: incompatible index of inserted column with frame index 

私はいくつかのここでの検索、および役立ったかもしれない何かを見ましたが、それは私に別のメッセージ与えなかった:

df['Sum of B'] = df.groupby('A').expanding().B.sum().reset_index(level = 0) 

ValueError: Wrong number of items passed 2, placement implies 1 

を上記のように

temp_df = df.groupby('A').expanding().B.sum().reset_index(level = 0).rename(columns = {'B' : 'Sum of B'}) 
new_df = pd.merge(df, temp_df, on = 'A', left_index = True, right_index = True) 
print (new_df) 

このコードは、期待される結果を与える:私はそれが仕事を得ることができる唯一の方法は、元のdfへの一時的なDFをマージした後、一時的なDFに結果を割り当てることです。

私もtransformを使ってさまざまなバリエーションを試しましたが、非難の前に行ったようにこれを1行にコーディングすることはできませんでした。動作する単一の構文がありますか?ありがとう。

+0

'df ['の合計] = df.groupby(' A ')。cumsum() – AChampion

+0

@AChampion:これは答えのためのものです。 – DSM

+0

ありがとう、これは動作します。私はこの質問に対して新しい質問をしなければならないかどうか分かりませんが、上記の例では、 'expansion'を 'rolling'に、 'sum'を 'mean'に置き換えています。 cumsumと同等のロールミアムはありますか?そうでない場合、私の質問は「ローリング」と「平均」の間有効です。私が新しい質問をしなければならないなら、私はします。 – BPowers97

答えて

0

あなたがCUMSUMを必要とするようだ:

df.groupby('A')['B'].cumsum() 
+0

ありがとう@AChampion。答えが更新され、DFに列がある場合は列 'B'が表示されます。 – Allen

0

TL; DR

df['Sum of B'] = df.groupby('A')['B'].transform(lambda x: x.expanding().sum()) 

私たちは、問題のある行から開始する説明

df.groupby('A')['B'].transform(lambda x: pd.expanding_sum(x)) 

はのは、慎重に読んでみましょうあなたに警告する上述:

FutureWarning:pd.expanding_sumシリーズのために推奨されておらず、今後のバージョンでは削除 なり、読んだ後 Series.expanding(min_periods = 1).SUM()

置き換えますPandas 0.17.0: pandas.expanding_sumSeries警告は、pd.expanding_sumの最初のパラメータであることが明らかになっています。私。私たちの場合はxです。

ここでは、警告で提案されているコード変換を適用します。したがってpd.expanding_sum(x)x.expanding(min_periods=1).sum()になります。

Pandas 0.22.0: pandas.Series.expandingによると、min_periodsのデフォルト値は1なので、あなたの場合は省略することができます。