Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何分组,然后将结果写入csv(及更多)_Python_Python 3.x_Pandas_Pandas Groupby - Fatal编程技术网

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,我不知道如何从那里获得它

我试图像这样添加TotalTimeArrived
df['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)