#python #pandas #statistics
#python #pandas #Статистика
Вопрос:
предполагая, что у меня есть список процессов A, B, C, D …. со временем
Process time
A 3
A 4
B 5
C 6
B 7
A 4
A 5
B 2
C 3
import pandas as pd
mydf = pd.DataFrame(columns=['process','time'],
data={'process':list('ABCABCABCDAABB'),'time':[2,3,4,5,6,4,5,6,4,5,6,2,3,4]})
То, что я хочу извлечь, — это фрейм данных, содержащий только одну запись для каждого процесса в строке и двух столбцах, среднее время и стандартное отклонение.
Я решил проблему следующим образом
processes=mydf.process.unique()
dfstats = pd.DataFrame(columns=['P','average','std'])
for process in processes:
mask = mydf.process == process
average,std = mydf.loc[mask,['time']]['time'].mean(),mydf.loc[mask,['time']]['time'].std()
dfstats.loc[len(dfstats)] =[process,average,std]
У меня такое чувство, что должен быть прямой способ сделать это. мое решение слишком подробное, слишком длинное и, вероятно, слишком медленное (я имею дело с парой миллионов строк)
любое другое решение, более похожее на pythonic-pandonic?
Спасибо
Ответ №1:
Вы находите статистику по каждой группе. Это можно сделать с помощью groupby
и agg
:
df.groupby("process").agg(["mean", "std"])
вывод:
mean std
process
A 4.0 1.870829
B 4.4 1.516575
C 4.0 0.000000
D 5.0 NaN
Комментарии:
1. да, определенно полезно 🙂
Ответ №2:
Попробуйте NamedAgg
на Series.Groupby
mydf.groupby('process')['time'].agg(average='mean', std='std').reset_index()
Out[148]:
process average std
0 A 4.0 1.870829
1 B 4.4 1.516575
2 C 4.0 0.000000
3 D 5.0 NaN