Вычисление среднего значения за x недель из перекрестной таблицы

#python #pandas

#python #pandas

Вопрос:

У меня есть таблица перекрестных таблиц с оценками для разных идентификаторов пользователей за каждую неделю. Каждая строка — это отдельный идентификатор пользователя, а каждый столбец — дата окончания недели. Это выглядит примерно так:

       01/01/2020   07/01/2020   14/01/2020    21/01/2020   28/01/2020          
1     0.8          0.8          0.95          0.66         0.9
2     0.9          0.6          0.55          0.56         0.88
3     1.0          0.4          0.66          null          0.67
4     0.5          0.2          null          0.8          0.45
 

Я хотел бы заменить каждую ячейку в таблице средним значением оценки и двумя предыдущими оценками (фактический фрейм данных очень большой с данными за несколько месяцев). Например, вместо 0,9 в правом верхнем углу было бы (0.9 0.66 0.95) / 3 = 0.836667. Иногда в ячейках будут нулевые значения, и в этом случае я хотел бы разделить на количество ненулевых ячеек (т. Е. Для нижнего правого это будет (0,45 0,8) / 2). Я могу получить среднее значение по строке, но не смог указать среднее значение по ячейкам. Любая помощь будет очень признательна.

Это данные:

 {'2020-08-14': {100000151529577: nan, 100000168029563: 0.9523809523809521},
 '2020-08-21': {100000151529577: nan, 100000168029563: 0.6666666666666661},
 '2020-09-04': {100000151529577: 0.8444444444444441, 100000168029563: nan},
 '2020-09-11': {100000151529577: 0.877551020408163, 100000168029563: 1.0},
 '2020-09-18': {100000151529577: 0.7884615384615381,
  100000168029563: 0.9047619047619041},
 '2020-09-25': {100000151529577: 0.9487179487179481, 100000168029563: 0.9},
 '2020-10-02': {100000151529577: 0.8536585365853651,
  100000168029563: 0.893617021276595},
 '2020-10-09': {100000151529577: 0.9189189189189191,
  100000168029563: 0.9302325581395341},
 '2020-10-16': {100000151529577: 0.8690476190476191,
  100000168029563: 0.904850746268656},
 '2020-10-23': {100000151529577: 0.934537246049661,
  100000168029563: 0.957627118644067},
 '2020-10-30': {100000151529577: 0.972447325769854,
  100000168029563: 0.9822560202788341},
 '2020-11-06': {100000151529577: 0.8617021276595741,
  100000168029563: 0.875912408759124},
 '2020-11-13': {100000151529577: 0.9708737864077671,
  100000168029563: 0.8983050847457621}}
 

Ответ №1:

Возможно, это не самое компактное решение, но оно решает вашу проблему:

 import pandas as pd
import numpy as np
d = {'2020-08-14': {100000151529577: np.nan, 100000168029563: 0.9523809523809521},
 '2020-08-21': {100000151529577:  np.nan, 100000168029563: 0.6666666666666661},
 '2020-09-04': {100000151529577: 0.8444444444444441, 100000168029563:  np.nan},
 '2020-09-11': {100000151529577: 0.877551020408163, 100000168029563: 1.0},
 '2020-09-18': {100000151529577: 0.7884615384615381,
  100000168029563: 0.9047619047619041},
 '2020-09-25': {100000151529577: 0.9487179487179481, 100000168029563: 0.9},
 '2020-10-02': {100000151529577: 0.8536585365853651,
  100000168029563: 0.893617021276595},
 '2020-10-09': {100000151529577: 0.9189189189189191,
  100000168029563: 0.9302325581395341},
 '2020-10-16': {100000151529577: 0.8690476190476191,
  100000168029563: 0.904850746268656},
 '2020-10-23': {100000151529577: 0.934537246049661,
  100000168029563: 0.957627118644067},
 '2020-10-30': {100000151529577: 0.972447325769854,
  100000168029563: 0.9822560202788341},
 '2020-11-06': {100000151529577: 0.8617021276595741,
  100000168029563: 0.875912408759124},
 '2020-11-13': {100000151529577: 0.9708737864077671,
  100000168029563: np.nan}}
 

Я ввел NaN значение во второй строке последней записи.

 df['average'] = df[[ '2020-10-30','2020-11-06','2020-11-13']].mean(axis=1)
df2 = df.drop(['2020-11-13'],axis =1)
df3 = df2.rename(columns={'average': '2020-11-13'}) 
 

который возвращает

                2020-08-14  2020-08-21  2020-09-04  2020-09-11  2020-09-18  
100000151529577         NaN         NaN    0.844444    0.877551    0.788462   
100000168029563    0.952381    0.666667         NaN    1.000000    0.904762   

                 2020-09-25  2020-10-02  2020-10-09  2020-10-16  2020-10-23  
100000151529577    0.948718    0.853659    0.918919    0.869048    0.934537   
100000168029563    0.900000    0.893617    0.930233    0.904851    0.957627   

                 2020-10-30  2020-11-06  2020-11-13  
100000151529577    0.972447    0.861702    0.935008  
100000168029563    0.982256    0.875912    0.929084  
 

Комментарии:

1. Спасибо за это. На самом деле я хочу заменить каждую ячейку в df на среднее значение самой себя и двух предыдущих ячеек, извиняюсь за то, что не прояснил это. Мой фактический фрейм данных очень большой, с данными за несколько месяцев