【问题标题】:How to aggregate a column's dates into a list of dates per person with Python Pandas?如何使用 Python Pandas 将列日期聚合到每个人的日期列表中?
【发布时间】:2021-04-22 04:06:51
【问题描述】:

我有以下数据,每行每个 ID 和 DATE。具有相同 ID 的人可以占用多行,因此可以占用多个日期。我想将其聚合为每行一个人(或 ID),日期将聚合为日期列表

从这里

ID   DATE
1    2012-03-04
1    2013-04-15
1    2019-01-09
2    2013-04-09
2    2016-01-01
2    2018-05-09

到这里

ID   DATE
1    [2012-03-04, 2013-04-15, 2019-01-09]
2    [2013-04-09, 2016-01-01, 2018-05-09]

这是我的尝试

df.sort_values(by=['ID', 'DATE'], ascending=True, inplace=True)
df = df[['ID', 'DATE']]
df_pivot = df.groupby('ID').aggregate(lambda tdf: tdf.unique().tolist())
df_pivot = pd.DataFrame(df_pivot.to_records())

问题是它返回类似这样的东西

ID   DATE
1    [1375228800000000000, 1411948800000000000, 1484524800000000000]
2    [1524528000000000000, 1529539200000000000, 1529542200000000000]

这是什么日期格式?我似乎找不到合适的函数将其转换回典型的日期格式。

【问题讨论】:

    标签: python-3.x pandas datetime aggregate


    【解决方案1】:

    如果需要列表中的唯一值,请在聚合 lists 之前使用 DataFrame.drop_duplicates

    df = (df.sort_values(by=['ID', 'DATE'], ascending=True)
            .drop_duplicates(['ID', 'DATE'])
            .groupby('ID')['DATE']
            .agg(list))
    

    在您的解决方案中应该可以工作,但速度很慢:

    df_pivot = df.groupby('ID')['DATE'].aggregate(lambda tdf: tdf.drop_duplicates().tolist())
    

    这是什么日期格式?

    如果是原生日期时间,也称为 unix 日期时间,以纳秒为单位。

    【讨论】:

    • 您介意解释一下为什么您的第一个解决方案运行得更快吗?因为你把所有东西都串联在一条线上?
    • @KubiK888 - 不,原因是如果为每个组使用一些自定义函数,它会很慢,因为为每个组运行(如果更复杂的函数,更慢)。因此,更好的是每个 DataFrame 运行一些函数,并且只为组运行最简单的函数。并非总是可能,但在这里是的 - 如果删除每列的重复项 + groupby + list 与groupby + unique list 相同
    【解决方案2】:

    很多方法...首选 agg 因为 apply 可能非常慢

    df.groupby('ID')['DATE'].agg(list)
    
    Or
    
    df.groupby('ID')['DATE'].apply(lambda x: x.to_list())
    

    【讨论】:

      【解决方案3】:

      只需使用groupby()apply() 方法:

      result=df.groupby('ID')['DATE'].apply(list)
      

      result=df.groupby('ID')['DATE'].agg(list)
      

      现在,如果您打印 result,您将获得所需的输出:

      ID
      1    [ 2012-03-04,  2013-04-15,  2019-01-09]
      2    [ 2013-04-09,  2016-01-01,  2018-05-09]
      Name: DATE, dtype: object
      

      上面的代码给你Series,如果你要Dataframe那就用:

      result=df.groupby('ID')['DATE'].apply(list).reset_index()
      

      【讨论】:

        猜你喜欢
        • 2018-09-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-01
        相关资源
        最近更新 更多