Как рассчитать среднее значение и дисперсию в панде DataFrame? - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть DataFrame, и я хочу рассчитать среднее значение и дисперсию для каждой строки для каждого человека.Кроме того, есть дата столбца, и хронологический порядок должен быть соблюден при расчете среднего значения и дисперсии;датафрейм уже отсортирован по дате.Дата - это просто номер дня после самой ранней даты.Среднее значение для самой ранней даты строки человека - это просто значение в столбце Points, а дисперсия должна быть равна NAN или 0. Затем для второй даты среднее значение должно быть средним значением значения в столбце.эта дата и предыдущая.Вот мой код для генерации кадра данных:

import pandas as pd
import numpy as np
data=[["Al",0, 12],["Bob",2, 10],["Carl",5, 12],["Al",5, 5],["Bob",9, 2]
 ,["Al",22, 4],["Bob",22, 16],["Carl",33, 2],["Al",45, 7],["Bob",68, 4]
 ,["Al",72, 11],["Bob",79, 5]]
df= pd.DataFrame(data, columns=["Name", "Date", "Points"])
print(df)

     Name  Date  Points
0     Al     0      12
1    Bob     2      10
2   Carl     5      12
3     Al     5       5
4    Bob     9       2
5     Al    22       4
6    Bob    22      16
7   Carl    33       2
8     Al    45       7
9    Bob    68       4
10    Al    72      11
11   Bob    79       5

Вот мой код для получения среднего значения и дисперсии:

df['Mean'] = df.apply(
lambda x: df[(df.Name == x.Name) & (df.Date < x.Date)].Points.mean(), 
axis=1)

df['Variance'] = df.apply(
lambda x: df[(df.Name == x.Name)& (df.Date < x.Date)].Points.var(), 
axis=1)

Однако среднее значение сдвигается на одну строку, адисперсия на два ряда.Фрейм данных, полученный при сортировке по Name и Date:

    Name    Date    Points  Mean    Variance
 0  Al       0       12      NaN        NaN
 3  Al       5       5     12.000000    NaN
 5  Al       22      4     8.50000  24.500000
 8  Al       45      7     7.000000 19.000000
10  Al       72      11    7.000000 12.666667
 1  Bob      2       10    NaN          NaN
 4  Bob      9       2     10.000000    NaN
 6  Bob      22      16    6.000000 32.000000
 9  Bob      68      4     9.333333 49.333333
11  Bob      79      5     8.000000 40.000000
2   Carl     5       12    NaN          NaN
7   Carl     33      2     12.000000    NaN

Вместо этого фрейм данных должен быть следующим:

Name        Date    Points  Mean    Variance
 0  Al       0       12      12       NaN
 3  Al       5       5       8.5      24.5
 5  Al       22      4       7        19
 8  Al       45      7       7        12.67
10  Al       72      11      7.8      ...
 1  Bob      2       10      10        NaN
 4  Bob      9       2       6        32
 6  Bob      22      16      9.33     49.33
 9  Bob      68      4       8        40
11  Bob      79      5       7.4      ...
2   Carl     5       12      12       NaN
7   Carl     33      2       7        50

Что мне изменить?

...