2017-08-09 6 views
1

J'utilise Pandas: entrée:pandas géants python quart de travail suivant les lignes pour les valeurs

import pandas as pd 
a=pd.Series([0,0,1,0,0,0,0]) 

sortie:

0 0 
1 0 
2 1 
3 0 
4 0 
5 0 
6 0 

Je veux obtenir des données pour lignes suivantes dans les mêmes valeurs:

sortie :

0 0 
1 0 
2 1 
3 1 
4 1 
5 1 
6 0 

utilisation

a+a.shift(1)+a.shift(2)+a.shift(3) 

Je pense que ce n'est pas une solution intelligente qui ont une solution intelligente pour cette

Répondre

0

Vous pouvez essayer cet indice supposant 6 devrait être la valeur 1 aussi,

a=pd.Series([0,0,1,0,0,0,0]) 
a.eq(1).cumsum() 

Out[19]: 
0 0 
1 0 
2 1 
3 1 
4 1 
5 1 
6 1 
dtype: int32 

Mise à jour : Plus d'une valeur différente de 0.

a=pd.Series([0,0,1,0,1,3,0]) 
a.ne(0).cumsum() 
A=pd.DataFrame({'a':a,'Id':a.ne(0).cumsum()}) 
A.groupby('Id').a.cumsum() 


Out[58]: 
0 0 
1 0 
2 1 
3 1 
4 1 
5 3 
6 3 

Ou vous pouvez utiliser ffill

a[a.eq(0)]=np.nan 
a.ffill().fillna(0) 

Out[64]: 
0 0.0 
1 0.0 
2 1.0 
3 1.0 
4 1.0 
5 3.0 
6 3.0 
+0

peut simplement faire 'cumsum' une raison quelconque pour la comparaison de bit' eq (1) '? –

+0

@AlexanderMcFarlane mis à jour. mais vous avez raison, l'approche précédente n'a pas besoin de 'eq' – Wen

0

1 Vous pouvez filtrer la série pour la valeur "votre" (searchValue).

2 Réindexer les dataseries à une longueur à être-indiqué (LengthOfIndex) et remplir en avant le « votre » un certain nombre de fois (LengthOfFillRange)

3 Remplissez-le avec des zéros à nouveau.

import pandas as pd 
import numpy as np 
a=pd.Series([0,0,1,0,0,0,0]) 
SearchValue  = 1 
LengthOfIndex  = 7 
LengthOfFillRange = 4 
a=a[a==SearchValue]\ 
    .reindex(np.linspace(1,LengthOfIndex,LengthOfIndex, dtype='int32'), 
       method='ffill', 
       limit=LengthOfFillRange)\ 
    .fillna(0) 
0

Si vous avez besoin de répéter seulement 2 valeurs de la série par une utilisation limite replace pour NaN s, puis ffill (fillna avec la méthode ffill) et dernier fillna pour convertir NaN s aux valeurs d'origine (et si nécessaire Convertissez int) :

a=pd.Series([0,0,1,0,0,0,0,1,0,0,0,]) 
print (a) 
0  0 
1  0 
2  1 
3  0 
4  0 
5  0 
6  0 
7  1 
8  0 
9  0 
10 0 
dtype: int64 

b= a.replace(0,np.nan).ffill(limit=2).fillna(0).astype(a.dtype) 
print (b) 
0  0 
1  0 
2  1 
3  1 
4  1 
5  0 
6  0 
7  1 
8  1 
9  1 
10 0 
dtype: int64