Python分组并获取平均值、最小值和最大值

3

我有一个类似这样的csv数据集:

Class,  Code,   Vendor, State,  NumberOfDays
3,      123,    Name1,  NE,     12.58402778
1,      876,    Name2,  TX,     12.51041667
3,      123,    Name1,  NE,     2.354166667
1,      876,    Name2,  TX,     12.21111111
3,      456,    Name2,  NY,     6.346527778
2,      876,    Name1,  NY,     5.513194444
3,      123,    Name1,  NE,     5.38125
1,      876,    Name2,  TX,     5.409722222

我已经编写了以下代码:

df = pd.read_csv(r'C:\Python36\Data\testing\LowHighMean.csv')
df2 = df.groupby(['Class','Code','Vendor','State'])['NumberOfDays'].mean().apply(lambda x: '{:.2f}'.format(x))
df2.to_csv(r'C:\Python36\Data\testing\output.csv')

通过对其他字段进行分组,这种方法可以很好地帮助我得到平均值“NumberOfDays”:

1,876,Name2,TX,10.04
2,876,Name1,NY,5.51
3,123,Name1,NE,6.77
3,456,Name2,NY,6.35

我似乎无法保留标题,但这并不重要,我只是在另一个步骤中添加了标题。我试图解决的问题是添加列,提供最低min()和最高max()值。我希望创建这个:

Class,  Code,   Vendor, State,  AverageDays, LowestNumberOfDays,    HighestNumberOfDays
1,      876,    Name2,  TX,     10.04,       5.41                   12.51             
2,      876,    Name1,  NY,     5.51,        5.51                   5.51
3,      123,    Name1,  NE,     6.77,        2.35                   12.58
3,      456,    Name2,  NY,     6.35,        6.35                   6.35   

起始数据文件的大小超过3GB,包含超过3000万条记录。经过转换后,文件大小变得更小。由于起始文件大小较大,我正在尝试找到一种方法,可以避免分四个不同步骤进行操作。我需要进行三个独立的步骤/运行来获取mean()max()min(),然后再进行第四次运行来将它们组合在一起。由于我是一个新手,甚至不知道如何在不设置4组代码并单独运行文件4次的情况下完成此操作。
1个回答

2
使用agg进行聚合,然后需要重命名列:
d = {'mean':'AverageDays','min':'LowestNumberOfDays','max':'HighestNumberOfDays'}
df = (df.groupby(['Class','Code','Vendor','State'])['NumberOfDays']
        .agg(['mean','min','max'])
        .rename(columns=d)
        .reset_index())
print (df)
   Class  Code Vendor State  AverageDays  LowestNumberOfDays  \
0      1   876  Name2    TX    10.043750            5.409722   
1      2   876  Name1    NY     5.513194            5.513194   
2      3   123  Name1    NE     6.773148            2.354167   
3      3   456  Name2    NY     6.346528            6.346528   

   HighestNumberOfDays  
0            12.510417  
1             5.513194  
2            12.584028  
3             6.346528  

感谢提供替代方案,Bharath shetty
df = df.pivot_table(index=['Class','Code','Vendor','State'],
                    value‌​s='NumberOfDays',
                    agg‌​func=('min','mean','‌​max'))
        .rename(column‌​s=d)
        .reset_index() 

那真是太快了。 - Bharath M Shetty
我建议使用df.groupby(['Class','Code','Vendor','State'], as_index=False),因为它看起来更好 :) - zipa
1
同时,使用数据透视表 df.pivot_table(index=['Class','Code','Vendor','State'],values='NumberOfDays',aggfunc=('min','mean','max')).rename(columns=d).reset_index() - Bharath M Shetty
@jezrael 工作得非常完美。谢谢你。 - John Minze
@jezrael 有趣...我一定会花些时间测试 :) - zipa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接