ここに示す例のデータは 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行にコーディングすることはできませんでした。動作する単一の構文がありますか?ありがとう。
'df ['の合計] = df.groupby(' A ')。cumsum() – AChampion
@AChampion:これは答えのためのものです。 – DSM
ありがとう、これは動作します。私はこの質問に対して新しい質問をしなければならないかどうか分かりませんが、上記の例では、 'expansion'を 'rolling'に、 'sum'を 'mean'に置き換えています。 cumsumと同等のロールミアムはありますか?そうでない場合、私の質問は「ローリング」と「平均」の間有効です。私が新しい質問をしなければならないなら、私はします。 – BPowers97