Existe-t-il un moyen dans Pandas d'utiliser la valeur de ligne précédente dans dataframe.appliquer lorsque la valeur précédente est également calculée dans appliquer?

J'ai le dataframe suivant:

 Index_Date    A    B    C    D
 ===============================
 2015-01-31    10   10   Nan  10
 2015-02-01     2    3   Nan  22 
 2015-02-02    10   60   Nan  280
 2015-02-03    10   100   Nan  250

Exiger:

 Index_Date    A    B    C    D
 ===============================
 2015-01-31    10   10   10   10
 2015-02-01     2    3   23   22
 2015-02-02    10   60   290  280
 2015-02-03    10   100  3000 250

Column C est dérivé de 2015-01-31 en prenant value de D.

, Puis-je utiliser le value de C pour 2015-01-31 et multipliez-la par le value de A sur 2015-02-01 et ajoutez B.

J'ai essayé un apply et un shift en utilisant un {[15] } par cela donne une erreur de clé.

25
demandé sur toasteez 2016-01-18 16:25:05

3 réponses

Tout d'abord, créez la valeur dérivée:

df.loc[0, 'C'] = df.loc[0, 'D']

Ensuite, parcourez les lignes restantes et remplissez les valeurs calculées:

for i in range(1, len(df)):
    df.loc[i, 'C'] = df.loc[i-1, 'C'] * df.loc[i, 'A'] + df.loc[i, 'B']


  Index_Date   A   B    C    D
0 2015-01-31  10  10   10   10
1 2015-02-01   2   3   23   22
2 2015-02-02  10  60  290  280
15
répondu Stefan 2016-01-18 14:34:37

Étant donné une colonne de nombres:

lst = []
cols = ['A']
for a in range(100, 105):
    lst.append([a])
df = pd.DataFrame(lst, columns=cols, index=range(5))
df

    A
0   100
1   101
2   102
3   103
4   104

Vous pouvez référencer la ligne précédente avec shift:

df['Change'] = df.A - df.A.shift(1)
df

    A   Change
0   100 NaN
1   101 1.0
2   102 1.0
3   103 1.0
4   104 1.0
10
répondu kztd 2017-05-03 17:05:52

L'application de la fonction récursive sur les tableaux numpy sera plus rapide que la réponse actuelle.

df = pd.DataFrame(np.repeat(np.arange(2, 6),3).reshape(4,3), columns=['A', 'B', 'D'])
new = [df.D.values[0]]
for i in range(1, len(df.index)):
    new.append(new[i-1]*df.A.values[i]+df.B.values[i])
df['C'] = new

Sortie

      A  B  D    C
   0  1  1  1    1
   1  2  2  2    4
   2  3  3  3   15
   3  4  4  4   64
   4  5  5  5  325
6
répondu 2016-12-10 07:25:53