Python 如何分组,然后将结果写入csv(及更多)
我的数据如下所示:Python 如何分组,然后将结果写入csv(及更多),python,python-3.x,pandas,pandas-groupby,Python,Python 3.x,Pandas,Pandas Groupby,我的数据如下所示: BOL,StopSequence,TimeArrived 5076223,1,12:52:56 PM 5076223,1,12:52:56 PM 5076223,2,9:50:58 AM 5076223,3,11:00:32 AM 5076223,4,11:00:52 AM 5077138,1,5:00:45 AM 5077138,2,1:43:13 PM 5077138,3,12:29:39 PM 5077138,4,1:02:31 PM 5077138,4,1:02:31
BOL,StopSequence,TimeArrived
5076223,1,12:52:56 PM
5076223,1,12:52:56 PM
5076223,2,9:50:58 AM
5076223,3,11:00:32 AM
5076223,4,11:00:52 AM
5077138,1,5:00:45 AM
5077138,2,1:43:13 PM
5077138,3,12:29:39 PM
5077138,4,1:02:31 PM
5077138,4,1:02:31 PM
5077138,5,1:02:50 PM
5077138,5,1:02:50 PM
5077138,5,1:02:50 PM
5077138,5,1:02:50 PM
如您所见,BOL是我的索引。一个BOL发生多个事件。有时,事件会重复自身(注意第2行和第3行StopSequence为1)
我需要做几件事:
- 按BOL对数据帧进行分组
- 如果事件在BOL组内重复,请删除-我只需要一个
- 按时间对BOL组中的事件进行排序
- 添加一个名为“TotalTimeArrived”的新列,它是TimeArrived的总和。我不介意BOL组内的每一个事件的值都会重复,但我很高兴听到建议
df = pd.read_csv('./data/simple.csv', skipinitialspace=True)
# Pre Processing Stage
# Turn TimeArrived feature into timedelta
df['TimeArrived'] = pd.to_timedelta(df['TimeArrived'].str.strip())
# Group by BOL and for every group, sort by TimeArrived
df = df.sort_values(['BOL', 'TimeArrived'], ascending=True).groupby('BOL')
unique_bol_count = df.BOL.nunique().count()
print("There are {} unique BOL in this file".format(unique_bol_count))
因此,我能够按时间对数据集进行分组和排序。现在,我得到了一个DataframeGroupBy,我不知道如何从那里获得它
我试图像这样添加TotalTimeArriveddf['TotalTimeArrived']=df['TimeArrived'].sum()
但错误是:
TypeError:“DataFrameGroupBy”对象不支持项分配
最后,当尝试使用df.to_csv('./result.csv')
编写结果csv时,我得到
AttributeError:无法访问“DataFrameGroupBy”对象的可调用属性“to_csv”,请尝试使用“apply”方法
我还无法删除BOL分组中的重复事件
非常感谢您的帮助,这里是
的问题输出。groupby('BOL')
是'DataFrameGroupBy'对象
,因此需要添加函数-这里是新专栏
此外,还添加了删除重复项的功能
非常感谢@jezrael,这一切都很有效!请允许我将问题进一步扩展,并增加一个复杂性。到达的时间是“驾驶时间”。例如,司机在09:50:58开始开车,12:52:56结束。所以我真正想做的是找出这个司机开了多长时间,以小时:分:秒为单位。有道理吗?因此,在本例中,驱动程序将运行约3小时2分钟。@FelipeCaldas-使用
df['Drive Time']]=df.groupby('BOL')['timearrized'].transform(lambda x:x.max()-x.min())
或df['Drive Time']=df.groupby('BOL')['timearrized'].transform(lambda x:x.iat[-1]-x.iat[0])
-每组上一次和第一次的差异
df['TimeArrived'] = pd.to_timedelta(df['TimeArrived'].str.strip())
df = (df.drop_duplicates(['BOL','TimeArrived'])
.sort_values(['BOL', 'TimeArrived'], ascending=True))
unique_bol_count = df.BOL.nunique()
print("There are {} unique BOL in this file".format(unique_bol_count))
There are 2 unique BOL in this file
df['TotalTimeArrived'] = df.groupby('BOL')['TimeArrived'].transform('sum')
print (df)
BOL StopSequence TimeArrived TotalTimeArrived
2 5076223 2 09:50:58 1 days 20:45:18
3 5076223 3 11:00:32 1 days 20:45:18
4 5076223 4 11:00:52 1 days 20:45:18
0 5076223 1 12:52:56 1 days 20:45:18
8 5077138 4 01:02:31 0 days 21:18:58
10 5077138 5 01:02:50 0 days 21:18:58
6 5077138 2 01:43:13 0 days 21:18:58
5 5077138 1 05:00:45 0 days 21:18:58
7 5077138 3 12:29:39 0 days 21:18:58
df.to_csv('./result.csv', index=False)