假设我有一个带有时间的进程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解决方案吗?
谢谢
答案 0 :(得分: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 :(得分:1)
在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