如何使用 Python Pandas 将列的日期聚合到每人的日期列表中?



我有以下数据,每行都有每个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]

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

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

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())

这是哪种日期格式?

If是本机日期时间,也称为unix日期时间(以纳秒为单位(。

多种方式。。。首选agg,因为应用可能非常慢

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

只需使用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()

最新更新