2017-01-02 19 views
5

は私が連続し1値のグループ内data_binaryの累積合計を計算したいdfのpythonパンダ条件付き累積合計

data data_binary sum_data 
    2  1   1 
    5  0   0 
    1  1   1 
    4  1   2 
    3  1   3 
    10  0   0 
    7  0   0 
    3  1   1 

私のデータフレームを考えてみましょう。

1の最初のグループは、1sum_dataの1つだけが1です。しかし、1の第2のグループは、3つの1を有し、sum_dataは、[1, 2, 3]である。

私はnp.where(df['data_binary'] == 1, df['data_binary'].cumsum(), 0)を使用してみましたが、それは私が欲しいものではありません

array([1, 0, 2, 3, 4, 0, 0, 5]) 

を返します。

+2

あなたは何を試しましたか、あなたの要件は何ですか?あなたの質問は明確ではありません。それを編集します。 – MYGz

+0

データ列を使ってsum_dataを計算したいと思います。 – GrayHash

+0

あなたは何を望んでいるのか、それを試したことが何の手掛かりではないのかまだ分かりません。 – dartdog

答えて

5

は私が考えることができますgroupby等しくない(!=)、その後cumsumでグループを作成する場合は、最初のshift編コラムで次の値を比較することによりSeriesDataFrameGroupBy.cumsum、と。最終maskでカラムdata_binary0を置き換える:あなたはdata_binaryの累積和を取り、data_binaryがゼロであった最新の累積和を減算したい

print (df.data_binary.ne(df.data_binary.shift()).cumsum()) 
0 1 
1 2 
2 3 
3 3 
4 3 
5 4 
6 4 
7 5 
Name: data_binary, dtype: int32 

df['sum_data1'] = df.data_binary.groupby(df.data_binary.ne(df.data_binary.shift()).cumsum()) 
           .cumsum() 
df['sum_data1'] = df['sum_data1'].mask(df.data_binary == 0, 0) 
print (df) 
    data data_binary sum_data sum_data1 
0  2   1   1   1 
1  5   0   0   0 
2  1   1   1   1 
3  4   1   2   2 
4  3   1   3   3 
5 10   0   0   0 
6  7   0   0   0 
7  3   1   1   1 
+0

あなたは今、奇妙な帽子を持っています! – piRSquared

9

b = df.data_binary 
c = b.cumsum() 
c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int) 

0 1 
1 0 
2 1 
3 2 
4 3 
5 0 
6 0 
7 1 
Name: data_binary, dtype: int64 

説明

cols = ['data_binary', 'cumulative_sum', 'nan_non_zero', 'forward_fill', 'final_result'] 
print(pd.concat([ 
     b, c, 
     c.mask(b != 0), 
     c.mask(b != 0).ffill(), 
     c.sub(c.mask(b != 0).ffill(), fill_value=0).astype(int) 
    ], axis=1, keys=cols)) 


    data_binary cumulative_sum nan_non_zero forward_fill final_result 
0   1    1   NaN   NaN    1 
1   0    1   1.0   1.0    0 
2   1    2   NaN   1.0    1 
3   1    3   NaN   1.0    2 
4   1    4   NaN   1.0    3 
5   0    4   4.0   4.0    0 
6   0    4   4.0   4.0    0 
7   1    5   NaN   4.0    1 

cumulative_sumに問題がdata_binaryがゼロの行は、やることであるのは、側によって各ステップの側面を見てみましょう合計をリセットしません。それがこのソリューションの動機です。 data_binaryがゼロの場合、どのように合計を「リセット」しますか?簡単! data_binaryがゼロである累積合計をスライスし、値を順方向に埋めます。私はこれと累積合計の差を取ると、効果的に合計をリセットしました。