pyspark 对超大 Dataframe 执行groupby和bfill的有效方法

slmsl1lt  于 2022-12-28  发布在  Spark
关注(0)|答案(1)|浏览(133)

有没有什么有效的方法来执行groupby并在大型 Dataframe 中执行前向填充?我有一个包含2768186062行的 Dataframe ,如下所示:

email                    email_created_date              country
a01423240@itesm.mx       2021-03-27 00:44:49+00:00          NaN
a01423240@itesm.mx       2022-01-14 16:27:18+00:00          IND
aalvarezleo@gmail.com    2021-05-14 13:24:15+00:00          NaN
aalvarezleo@gmail.com    2021-09-16 16:09:45+00:00          IND
acabazot@gmail.com       2021-03-27 00:38:37+00:00          NaN
acabazot@gmail.com       2022-01-14 12:25:28+00:00          IND
alt_wwe@hotmail.com      2022-09-22 22:08:50+00:00          NaN
alt_wwe@hotmail.com      2022-09-22 22:11:51+00:00          CA

我想根据同一封电子邮件向后填充国家列,因此预期输出如下所示:

email                    email_created_date              country
a01423240@itesm.mx       2021-03-27 00:44:49+00:00          IND
a01423240@itesm.mx       2022-01-14 16:27:18+00:00          IND
aalvarezleo@gmail.com    2021-05-14 13:24:15+00:00          IND
aalvarezleo@gmail.com    2021-09-16 16:09:45+00:00          IND
acabazot@gmail.com       2021-03-27 00:38:37+00:00          IND
acabazot@gmail.com       2022-01-14 12:25:28+00:00          IND
alt_wwe@hotmail.com      2022-09-22 22:08:50+00:00          CA
alt_wwe@hotmail.com      2022-09-22 22:11:51+00:00          CA

我使用下面的代码完成了这一步:

dt1[['country']]=(dt1
                  .sort_values(['email','email_created_date'])
                  .groupby(['email'], as_index=False)[['country']].fillna(method='bfill'))

但是由于 Dataframe 非常大,执行上述代码花费了很多时间(超过一个小时)。2有人能建议/帮助以最有效的方式执行上述操作吗?3我想确保我尽可能地高效(我的计算机花了很长时间来读取所有这些文件并将其合并到内存中)。4请帮助!

xzlaal3s

xzlaal3s1#

下面是一个如何提高效率的示例:

def bfill_country(df):
    return df['country'].bfill()

dt1['country'] = dt1.sort_values(['email', 'email_created_date']).groupby('email').apply(bfill_country)

此代码首先定义函数bfill_country,该函数将DataFrame作为输入,并返回一个国家列向后填充的序列。然后,它使用groupby和apply方法将此函数分别应用于每个组,并将结果赋回原始DataFrame的国家列。
这应该比您建议的解决方案更快,因为它避免了一次填充所有缺失值,而是一次填充一组。
如果有帮助就告诉我!

相关问题