我有一个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个文件。
答案 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'],
values='NumberOfDays',
aggfunc=('min','mean','max'))
.rename(columns=d)
.reset_index()