【问题标题】:How to groupby and then write the result to csv (and more)如何分组然后将结果写入 csv(以及更多)
【发布时间】:2019-08-23 20:39:40
【问题描述】:

我的数据如下所示:

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 组内重复发生,请删除 - 我只想要一个
  • 按 TimeArrived 对 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))

所以我能够按 TimeArrived 对数据集和排序进行分组。现在我得到了一个 DataframeGroupBy,但我不知道如何从那里获取它。

我正在尝试像这样添加 TotalTimeArrived df['TotalTimeArrived'] = df['TimeArrived'].sum() 但错误是:

TypeError: 'DataFrameGroupBy' 对象不支持项目分配

最后,当尝试使用df.to_csv('./result.csv') 写入结果 csv 时,我得到了

AttributeError:无法访问“DataFrameGroupBy”对象的可调用属性“to_csv”,请尝试使用“apply”方法。

我还无法删除 BOL 分组中的重复事件。

非常感谢任何帮助,谢谢

【问题讨论】:

    标签: python python-3.x pandas pandas-groupby


    【解决方案1】:

    这里是.groupby('BOL') 的问题输出是'DataFrameGroupBy' object,所以需要添加函数 - 这里是新列GroupBy.transform

    还添加了删除重复项DataFrame.drop_duplicates

    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)
    

    【讨论】:

    • 非常感谢@jezrael,这是有效的!请允许我进一步扩展问题并增加一个复杂性。 TimeArrived 是“行驶时间”。例如,司机在 09:50:58 开始驾驶并在 12:52:56 结束。所以我真正想做的是找出这个司机开车了多长时间,以小时:分钟:秒为单位。说得通?所以在这个例子中司机大约需要 3 小时 2 分钟。
    • @FelipeCaldas - 使用df['Drive Time'] = df.groupby('BOL')['TimeArrived'].transform(lambda x: x.max() - x.min())
    • df['Drive Time'] = df.groupby('BOL')['TimeArrived'].transform(lambda x: x.iat[-1] - x.iat[0]) - 每组最后一次和第一次的差异
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-29
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多