2015-12-13 2 views
-1

Je souhaite créer une nouvelle colonne comp dans une base de données pandas contenant une seule colonne price. La valeur de cette nouvelle colonne doit être générée par une fonction qui fonctionne sur les 3 dernières valeurs du price. df.apply() fonctionne sur une seule ligne, shift() ne semble pas fonctionner. Les experts ont-ils des suggestions pour le faire fonctionner dans une opération vectorisée?accéder aux lignes précédentes dans la méthode data python appliquer la méthode

+0

'pd.rolling_apply' –

+0

Vous pourriez vouloir votre tentative avec les méthodes 'shift' ou' rolling_apply'. –

+0

Pouvez-vous ajouter un exemple? Peut-être aider [ceci] (http://stackoverflow.com/help/mcve) et comment Stackoverflow [fonctionne] (http://stackoverflow.com/tour). – jezrael

Répondre

0

Utilisez une fonction de somme de série group.apply(). Ci-dessous suppose que vous avez un index ou une colonne nommée ID de valeurs de ligne croissantes 1, 2, 3, ... qui peut être utilisé pour compter 3 valeurs en arrière.

# SERIES SUM FUNCTION 
def intsum(x): 
    if x < 3:   
     ser = df.price[(df.ID < x)] 
    else: 
     ser = df.price[(df.ID >= x - 3) & (df.ID < x)] 
    return ser.sum()  

# APPLY FUNCTION 
df['comp'] = df['ID'].apply(intsum) 
0

Vous pouvez utiliser rolling_sum avec le paramètre min_periods=1, parce que vous voulez compter les premières valeurs aussi:

print df 
    price 
0  1 
1  2 
2  3 
3  4 
4  5 
5  6 
6  7 


df['comp'] = pd.rolling_sum(df['price'], window=3, min_periods=1) 
print df 
    price comp 
0  1  1 
1  2  3 
2  3  6 
3  4  9 
4  5 12 
5  6 15 
6  7 18 

solution suivante est d'utiliser map:

print df 
    price 
0  1 
1  2 
2  3 
3  4 
4  5 
5  6 
6  7 

def f(x): 
    return (df.price[(df.index - 1 >= x - 3) & (df.index - 1 < x)]).sum() 

df['comp'] = df.index.map(f) 

print df 
    price comp 
0  1  1 
1  2  3 
2  3  6 
3  4  9 
4  5 12 
5  6 15 
6  7 18