2014-06-12 1 views
1

J'essaie de calculer les valeurs max et min locales pour une série de données: si la valeur de ligne courante est supérieure ou inférieure à la ligne suivante et précédente, réglez-la sur la valeur courante, sinon sur NaN . Est-il possible de faire plus élégante, les autres que celui-ci:Lignes de voisins d'accès dans Pandas.Dataframe

import pandas as pd 
import numpy as np 

rng = pd.date_range('1/1/2014', periods=10, freq='5min') 
s = pd.Series([1, 2, 3, 2, 1, 2, 3, 5, 7, 4], index=rng) 
df = pd.DataFrame(s, columns=['val']) 
df.index.name = "dt" 
df['minmax'] = np.NaN 

for i in range(len(df.index)): 
    if i == 0: 
     continue 
    if i == len(df.index) - 1: 
     continue 
    if df['val'][i] >= df['val'][i - 1] and df['val'][i] >= df['val'][i + 1]: 
     df['minmax'][i] = df['val'][i] 
     continue 
    if df['val'][i] <= df['val'][i - 1] and df['val'][i] <= df['val'][i + 1]: 
     df['minmax'][i] = df['val'][i] 
     continue 

print(df) 

Le résultat est:

     val minmax 
dt        
2014-01-01 00:00:00 1  NaN 
2014-01-01 00:05:00 2  NaN 
2014-01-01 00:10:00 3  3 
2014-01-01 00:15:00 2  NaN 
2014-01-01 00:20:00 1  1 
2014-01-01 00:25:00 2  NaN 
2014-01-01 00:30:00 3  NaN 
2014-01-01 00:35:00 5  NaN 
2014-01-01 00:40:00 7  7 
2014-01-01 00:45:00 4  NaN 

Répondre

0

Nous pouvons utiliser shift et where pour déterminer ce qu'il faut attribuer les valeurs, surtout, nous devons utiliser les comparateurs de bits & et | lors de la comparaison de séries. Shift retournera une série ou DataFrame décalée de 1 ligne (par défaut) ou la valeur transmise.

Lorsque vous utilisez where nous pouvons passer une condition booléenne et le deuxième paramètre NaN lui dit d'affecter cette valeur si False.

In [81]: 

df['minmax'] = df['val'].where(((df['val'] < df['val'].shift(1))&(df['val'] < df['val'].shift(-1)) | (df['val'] > df['val'].shift(1))&(df['val'] > df['val'].shift(-1))), NaN) 
df 
Out[81]: 
        val minmax 
dt        
2014-01-01 00:00:00 1  NaN 
2014-01-01 00:05:00 2  NaN 
2014-01-01 00:10:00 3  3 
2014-01-01 00:15:00 2  NaN 
2014-01-01 00:20:00 1  1 
2014-01-01 00:25:00 2  NaN 
2014-01-01 00:30:00 3  NaN 
2014-01-01 00:35:00 5  NaN 
2014-01-01 00:40:00 7  7 
2014-01-01 00:45:00 4  NaN 
Questions connexes