Как агрегировать значения фрейма данных по среднему значению в Python?

#python #python-3.x #pandas #dataframe #pandas-groupby

#python #python-3.x #панды #фрейм данных #pandas-groupby

Вопрос:

У меня есть следующий фрейм данных, состоящий из количества сообщений, сделанных пользователем в течение 2 недель (дней от -7 до 7). Я хочу создать другой фрейм данных, в котором должно быть среднее количество сообщений, сделанных в день. Я написал следующий код, но он возвращает мне серию с 1 столбцом вместо фрейма данных. Требуемый фрейм данных должен иметь 2 отдельных столбца для day и mean .

Часть фрейма данных (df)

 UserId          Date                -7  -6  -5  -4  -3  -2  -1  0   1   2   3   4   5   6   7
87      2011-05-10 18:38:55.030     0   0   0   0   0   0   1   0   0   0   0   0   0   0   0
487     2011-11-29 14:46:12.080     0   0   1   0   0   0   0   0   0   0   0   0   0   0   0
21      2012-03-02 14:35:06.867     0   1   0   1   2   0   2   2   0   1   2   2   1   3   1
  

КОД (для получения средних сообщений в день)

 df.iloc[:,2:].mean()
  

Вывод кода

 -7  0
-6  0.33
-5  0.33
-4  0.33
-3  0.66
-2  0
-1  1
0   0.66
1   0
2   0.33
3   0.66
4   0.66
5   0.33
6   1
7   0.33
  

Этот вывод правильный, единственная проблема в том, что это серия. Ожидаемый результат должен иметь 2 отдельных столбца для day и mean , как показано.

Ожидаемый результат

 day mean
-7  0
-6  0.33
-5  0.33
-4  0.33
-3  0.66
-2  0
-1  1
0   0.66
1   0
2   0.33
3   0.66
4   0.66
5   0.33
6   1
7   0.33
  

Ответ №1:

Используйте Series.rename_axis with Series.reset_index , поэтому устанавливать новые имена столбцов не обязательно:

 df1 = df.iloc[:,2:].mean().rename_axis('day').reset_index(name='mean')
print (df1)
   day      mean
0   -7  0.000000
1   -6  0.333333
2   -5  0.333333
3   -4  0.333333
4   -3  0.666667
5   -2  0.000000
6   -1  1.000000
7    0  0.666667
8    1  0.000000
9    2  0.333333
10   3  0.666667
11   4  0.666667
12   5  0.333333
13   6  1.000000
14   7  0.333333
  

РЕДАКТИРОВАТЬ: работа с seaborn 11:

 sns.lineplot(data=df1, x = 'day', y = 'mean', err_style="bars",ci=68)
  

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

1. Это работает правильно, но если я использую эти данные для построения линейного графика, стандартное отклонение не отображается. Можете ли вы предоставить способ его построения? sns.lineplot(x = df1['day'], y = df1['mean'])

2. @IshanDutta — Использовать sns.lineplot(data=df1, x = 'day', y = 'mean')

3. Я использовал это, но это дает мне тот же график со стандартным отклонением.

4. Но это 2 разных графика, в случае seaborn std должен отображаться как доверительный интервал или полоса ошибок.

5. @IshanDutta — К сожалению, не понимаю, решение последнего абзаца тоже не работает?