#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 — К сожалению, не понимаю, решение последнего абзаца тоже не работает?