【发布时间】:2021-11-27 03:59:11
【问题描述】:
我有一个包含大约 3 亿行和两列的 DataFrame。我需要对第二列进行排序,同时将第一列中具有相同值的所有行放在一起,但第一列的顺序无关紧要。
如果我开始:
|ID |Date
0|DEF |2000-01-01
1|ABC |2000-01-01
2|DEF |2000-02-01
3|ABC |2000-02-01
我需要以以下任一方式结束:
|ID |Date
0|DEF |2000-01-01
2|DEF |2000-02-01
1|ABC |2000-01-01
3|ABC |2000-02-01
或
|ID |Date
1|ABC |2000-01-01
3|ABC |2000-02-01
0|DEF |2000-01-01
2|DEF |2000-02-01
但是我得到第一个还是第二个都没关系。跑步
df.sort_values(by=["ID", "Date"])
完整的数据集大约需要 8 分钟,但其中一部分时间用于确保 ID 列的顺序正确,这对我来说无关紧要。我能想到在不排序 ID 的情况下对 ID 组中的 Date 进行排序的唯一方法是
df.groupby("ID", sort=False).apply(lambda x: x.sort_values(by=["Date"])
但是 groupby 代码的运行时间比仅对 ID 列进行排序要长得多。在 10,000,000 行的较小样本中,groupby 排序需要 10 多分钟,而两列排序需要 17.6 秒。
有没有一种聪明的方法来对第一列中的第二列进行排序,这比仅对两列进行排序更有效,还是双列排序是我最快的?
【问题讨论】:
-
我不认为你的样本数据能很好地捕捉到你所追求的;它不会捕获您确保 ID 顺序正确的部分。
-
我从不想确保 ID 的顺序正确。 ID 可以按任何顺序排列,我不想花时间对该列进行排序,但我不能只按日期排序,否则类似的 ID 不会被组合在一起。
-
也许将 ID 列设为分类然后排序。不过,3 亿行很重要,所以不确定你还能在这里做什么。
pydatatable可能更快;不过它没有 Pandas 那么多的功能,而且我还没有在 300m 行上测试过
标签: python pandas performance sorting