pandas: вычислить среднее время и стандартное отклонение уникальных значений столбца

#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