2016-11-28 15 views
2

は、私は次のように定義されたパンダのデータフレームを持っている:Pythonのパンダのデータフレーム1非ゼロと非NaNの属性n行ごと

2009-11-18 500.0 
2009-11-19 500.0 
2009-11-20 NaN 
2009-11-23 500.0 
2009-11-24 500.0 
2009-11-25 NaN 
2009-11-27 NaN 
2009-11-30 NaN 
2009-12-01 500.0 
2009-12-02 500.0 
2009-12-03 500.0 
2009-12-04 500.0 
2009-12-07 NaN 
2009-12-08 NaN 
2009-12-09 500.0 
2009-12-10 500.0 
2009-12-11 500.0 
2009-12-14 500.0 

私の意図は、一つの非NaNの要素ごとにn行を維持することです。たとえば、私のnが4なら、私は2009-11-18 500を保存し、それ以外のものはすべて(そしてそれも含めて)2009-11-23に0に設定します。配列の他の要素についても同じことを繰り返すでしょう。 pythonic、これをベクトル化した方法?

これは、より具体的にするために、私はこのように見えるように、最終的にアレイ上のつもり:

2009-11-18 500.0 
2009-11-19 0 
2009-11-20 0 
2009-11-23 0 
2009-11-24 500.0 
2009-11-25 0 
2009-11-27 0 
2009-11-30 0 
2009-12-01 500.0 
2009-12-02 0 
2009-12-03 0 
2009-12-04 0 
2009-12-07 0 
2009-12-08 0 
2009-12-09 500.0 
2009-12-10 0 
2009-12-11 0 
2009-12-14 0 
+0

だから、最後のグループの長さは、値が省略され、 '4'ない場合は? – jezrael

答えて

1

私はあなたがgroupby、その後、グループを作成するためのフロアdivisonで最初np.arangeを使用し、最初の非NaNのインデックスを取得することができると思います値はidxmaxです。 aの値が含まれていない場合は最終whereによって0はGET:

print (np.arange(len(df.index)) // 4) 
[0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4] 

idx = df.col.groupby([np.arange(len(df.index)) // 4]).idxmin() 
print (idx) 
0 2009-11-18 
1 2009-11-24 
2 2009-12-01 
3 2009-12-09 
4 2009-12-11 
Name: col, dtype: datetime64[ns] 

df.col = df.col.where(df.index.isin(idx), 0) 
print (df) 
       col 
2009-11-18 500.0 
2009-11-19 0.0 
2009-11-20 0.0 
2009-11-23 0.0 
2009-11-24 500.0 
2009-11-25 0.0 
2009-11-27 0.0 
2009-11-30 0.0 
2009-12-01 500.0 
2009-12-02 0.0 
2009-12-03 0.0 
2009-12-04 0.0 
2009-12-07 0.0 
2009-12-08 0.0 
2009-12-09 500.0 
2009-12-10 0.0 
2009-12-11 500.0 
2009-12-14 0.0 

ソリューションを最後のグループの長さは4でない場合は、最後の値がomitingさ:

arr = np.arange(len(df.index)) // 4 
print (arr) 
[0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 4 4] 

#if equal by last value of array substract 1 
arr1 = np.where(arr == arr[-1], arr[-1] - 1, arr) 
print (arr1) 
[0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 3 3] 

idx = df.col.groupby(arr1).idxmin() 
print (idx) 
0 2009-11-18 
1 2009-11-24 
2 2009-12-01 
3 2009-12-09 
Name: col, dtype: datetime64[ns] 
df.col = df.col.where(df.index.isin(idx), 0) 
print (df) 
       col 
2009-11-18 500.0 
2009-11-19 0.0 
2009-11-20 0.0 
2009-11-23 0.0 
2009-11-24 500.0 
2009-11-25 0.0 
2009-11-27 0.0 
2009-11-30 0.0 
2009-12-01 500.0 
2009-12-02 0.0 
2009-12-03 0.0 
2009-12-04 0.0 
2009-12-07 0.0 
2009-12-08 0.0 
2009-12-09 500.0 
2009-12-10 0.0 
2009-12-11 0.0 
2009-12-14 0.0 
1

IIUC
ます次の価値が得られたら、カウンターを再起動してください。この場合、私はジェネレータを使用します。ベクトル化されません!

def next4(s): 
    idx = s.first_valid_index() 
    while idx is not None: 
     loc = s.index.get_loc(idx) 
     yield s.loc[[idx]] 
     idx = s.iloc[loc+4:].first_valid_index() 

pd.concat(next4(df[1])).reindex(df.index, fill_value=0).to_frame() 

enter image description here

関連する問題