2017-02-08 8 views
2

こんにちは、(複数の列にまたがる)データフレーム内の連続するゼロ観測の数を数えるカウンタを実装したいと思います。しかし、ゼロ以外の観測値が見つかった場合はリセットしたいと思います。私はforループを使用しましたが、それは非常に遅いです、私ははるかに効率的な方法が必要であると確信しています。これは私のコードである:ここpython pandaデータフレームでリセットするカウンタを実装する

私が最初

df1=pd.DataFrame(index= df, columns=df) 
df1=df1.fillna(0) 

上方DFの同じ特性を有する空のデータフレーム(データフレーム)を初期化DF

df.head() 

        ACL  ACT  ADH  ADR  AFE AFH  AFT 
2013-02-05  NaN  NaN  NaN  NaN  NaN NaN  NaN 
2013-02-12 -0.136861 -0.020406 0.046150 0.000000 -0.005321 NaN 0.058195 
2013-02-19 -0.006632 0.041665 0.007365 0.012738 0.040930 NaN -0.037818 
2013-02-26 -0.023848 -0.023999 -0.030677 -0.003144 0.050604 NaN -0.047604 
2013-03-05 0.009771 -0.024589 -0.021073 -0.039432 0.047315 NaN 0.068727 

のスナップショットであるそれから作成します行を繰り返し処理する関数ですが、これは一度に1つの列しか処理しません。

def zero_obs(x=df,y=df1): 
    for i in range(len(x)): 
     if x[i] == 0: 
      y[i] = y[i-1] + 1 
     else: 
      y[i] = 0 
    return y 

for col in df.columns: 
    df1[col] = zero_obs(x=df[col],y=df1[col]) 

本当に助けてくれてありがとう!

次のように私は期待して出力されている:

df1.tail() 
      BRN AXL TTO AGL ACL 
2017-01-03 3 125 0 0 0 
2017-01-10 0 126 0 0 0 
2017-01-17 1 127 0 0 0 
2017-01-24 0 128 0 0 0 
2017-01-31 0 129 1 0 0 
+0

に同じようにうまく動作し、あなたの予想される出力は何ですか? – Zero

+0

こんにちはJohn、最初の質問を参照してください、私はカウンタの出力とデータフレーム(df1)である期待された結果を更新しました – blala82

答えて

0

セットアップ
は、データフレームdf

df = pd.DataFrame(
    np.zeros((10, 2), dtype=int), 
    columns=list('AB') 
) 
df.loc[[0, 4, 8], 'A'] = 1 
df.loc[6, 'B'] = 1 
print(df) 

    A B 
0 1 0 
1 0 0 
2 0 0 
3 0 0 
4 1 0 
5 0 0 
6 0 1 
7 0 0 
8 1 0 
9 0 0 

オプション1
考えてみましょうpandasapply

def zero_obs(x): 
    """`x` is assumed to be a `pd.Series`""" 
    csum = x.eq(0).cumsum() 
    cpos = csum.where(x.ne(0)).ffill().fillna(0) 
    return csum.sub(cpos) 

print(df.apply(zero_obs)) 

    A B 
0 0.0 1.0 
1 1.0 2.0 
2 2.0 3.0 
3 3.0 4.0 
4 0.0 5.0 
5 1.0 6.0 
6 2.0 0.0 
7 3.0 1.0 
8 0.0 2.0 
9 1.0 3.0 

オプション2
apply

を使用しないでください。この関数はdf

zero_obs(df) 

    A B 
0 0.0 1.0 
1 1.0 2.0 
2 2.0 3.0 
3 3.0 4.0 
4 0.0 5.0 
5 1.0 6.0 
6 2.0 0.0 
7 3.0 1.0 
8 0.0 2.0 
9 1.0 3.0 
+0

あまりにもありがとう:) – blala82

+0

最初の観測が非効率である場合、 – blala82

+0

@ blala82私は同じことを観察しました。投稿は既に更新されています。私が今持っている機能を試してみてください。 – piRSquared

関連する問題