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

时间:2017-10-17 14:40:58

标签: python pandas csv

我有一个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   

起始数据文件的大小超过3 gig,超过3000万条记录。转换后文件大小变小。由于起始文件大小,我试图找出一种方法,我可以避免在四个不同的步骤中这样做。 3个单独的步骤/运行来获取mean()max()min()然后再运行以组合它们。由于我是菜鸟,我甚至不知道如何设置4组代码并单独运行4个文件。

1 个答案:

答案 0 :(得分: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()