2017-04-20 3 views
2

私は以下のデータフレームを持っています。霊長類全体のテーブルとゼロでリセット

d = pd.DataFrame({'one' : [0,1,1,1,0,1],'two' : [0,0,1,0,1,1]}) 

d 

    one two 
0 0 0 
1 1 0 
2 1 1 
3 1 0 
4 0 1 
5 1 1 

私はゼロ

所望の出力が

pd.DataFrame({'one' : [0,1,2,3,0,1],'two' : [0,0,1,0,1,2]}) 

    one two 
0 0 0 
1 1 0 
2 2 1 
3 3 0 
4 0 1 
5 1 2 

でなければなりません

でリセット累積和をしたい私は、グループを使用して試してみましたが、それはテーブル全体では動作しません。

+0

@piRSquared - それは非常に興味深いです! – onkar

答えて

4
df2 = df.apply(lambda x: x.groupby((~x.astype(bool)).cumsum()).cumsum()) 
print(df2) 

出力:

one two 
0 0 0 
1 1 0 
2 2 1 
3 3 0 
4 0 1 
5 1 2 
+0

これは良いことです:-) – piRSquared

+0

LOL ....私はあなたの方法を自分の罠の袋に追加すると答えました。 –

+0

ありがとうpiRSquaredとありがとうScott :) – onkar

0

これはそれを行う必要があります。

d = {'one' : [0,1,1,1,0,1],'two' : [0,0,1,0,1,1]} 
one = d['one'] 
two = d['two'] 
i = 0 
new_one = [] 
for item in one: 
    if item == 0: 
     i = 0 
    else: 
     i += item 
    new_one.append(i) 

j = 0 
new_two = [] 
for item in two: 
    if item == 0: 
     j = 0 
    else: 
     j += item 
    new_two.append(j) 

d['one'], d['two'] = new_one, new_two 
df = pd.DataFrame(d) 
0

これ一つでnumpyの、リスト内包表記をパンダを使用しますが、使用しない:

import numpy as np 

d = {'one': [0,1,1,1,0,1], 'two': [0,0,1,0,1,1]} 

out = {} 
for key in d.keys(): 
    l = d[key] 
    indices = np.argwhere(np.array(l)==0).flatten() 
    indices = np.append(indices, len(l)) 
    out[key] = np.concatenate([np.cumsum(l[indices[n-1]:indices[n]]) \ 
        for n in range(1, indices.shape[0])]).ravel() 
print(out) 

ファースト、私はすべての出現を見つける0(リストを分割する位置)を選択すると、結果のサブリストのcumsumが計算され、新しいdictに挿入されます。このトラブルを通過するのはなぜ

3

pandas

def cum_reset_pd(df): 
    csum = df.cumsum() 
    return (csum - csum.where(df == 0).ffill()).astype(d.dtypes) 

cum_reset_pd(d) 

    one two 
0 0 0 
1 1 0 
2 2 1 
3 3 0 
4 0 1 
5 1 2 

numpy

def cum_reset_np(df): 
    v = df.values 
    z = np.zeros_like(v) 
    j, i = np.where(v.T) 
    r = np.arange(1, i.size + 1) 
    p = np.where(
     np.append(False, (np.diff(i) != 1) | (np.diff(j) != 0)) 
    )[0] 
    b = np.append(0, np.append(p, r.size)) 
    z[i, j] = r - b[:-1].repeat(np.diff(b)) 
    return pd.DataFrame(z, df.index, df.columns) 

cum_reset_np(d) 

    one two 
0 0 0 
1 1 0 
2 2 1 
3 3 0 
4 0 1 
5 1 2 


より速いですから!

enter image description here

+1

私はdf [5、 'one']は1と同じで4ではないはずだと思います。 –

+0

ニース! NumPyの魔法。 –

+1

その価値のあるトラブル!人々は読みやすさについて不平を言うよりむしろ理解する時間が必要です:) – Divakar