#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 на среднее значение самой себя и двух предыдущих ячеек, извиняюсь за то, что не прояснил это. Мой фактический фрейм данных очень большой, с данными за несколько месяцев