【问题标题】:Drop duplicates and complete nan with oldest values and optimise runing time删除重复项并使用最旧的值完成 nan 并优化运行时间
【发布时间】:2025-12-27 04:50:11
【问题描述】:

我正在处理包含一些列的数据库,并且在按日期(格式 Y-m-d)对值进行排序后删除重复项。我的 df 如下所示:

id    date         name     firstname
01    2020-04-01   max      smith
04    2020-08-04   georges  yellow
01    2020-05-31            smith
03    2020-02-24   emma     blue
01    2020-01-02   maxime   smith
02    2020-12-17   matt     green
02    2020-04-05   matt       

我的代码如下:

liste_id= list(df['id'].drop_duplicates())
df_ind = pd.DataFrame()
for i in range(len(liste_id)):
    df_int = df[df['id'] == liste_id[i]]
    df_int = df_int.loc[:,].sort_values(['date'], ascending=True).drop_duplicates("id", keep='last')
    df_ind = df_ind.append(df_int)

我得到 df_ind:

id    date         name     firstname
01    2020-05-31            smith
02    2020-12-17   matt     green
03    2020-02-24   emma     blue
04    2020-08-04   georges  yellow

但我的目标是完成我的结果。我在最近的值中有一些 NaN,我想用旧行的数据替换它们。对于我的示例的第一个 id,我想用名字“max”完成我的 2020-05-31 行,因为它是最近完成的名字(2020-04-01)。Maxime 已完成,但日期是较旧(2020-01-02)。我希望 df_ind 看起来像这样:

id    date         name     firstname
01    2020-05-31   max      smith
02    2020-12-17   matt     green
03    2020-02-24   emma     blue
04    2020-08-04   georges  yellow

我的问题是我有很多行(超过 600 000 ......)所以有人知道达到我的目标吗?并优化运行时间?

在此先谢谢你,抱歉我的英语不好..!

【问题讨论】:

  • 目前我找到的解决方案是在 drop_duplicates 之前添加 fillna(method='bfill')。但这似乎需要很多时间..

标签: python pandas drop-duplicates


【解决方案1】:

您可以通过删除 for 循环来优化您的代码。正如您在评论中提到的那样,我认为使用fillna(method='bfill') 是个好主意。你可以这样做:

df_ind = df.sort_values(by=["firstname", "date"], ascending=[True, False]).fillna(method="bfill")
df_ind = (df_ind.sort_values(by=["id", "date"], ascending=[True, False])
            .drop_duplicates(subset=["id"]))

【讨论】:

  • 只是建议,请删除我编辑或自己编辑。
  • 感谢您的建议,但删除 for 循环对我不起作用,因为现在 fillna 对 id 没有限制。一些变量由其他标识符的变量补充。别人没有填写自己的名字或姓氏的时候有别人的信息是很尴尬的
  • 我更好地理解了这个问题。我更新了代码并将其分成两部分