gpt4 book ai didi

python - 翻转已排序数据框的排序顺序

转载 作者:行者123 更新时间:2023-12-04 02:33:09 26 4
gpt4 key购买 nike

我有一堆结构如下的数据框

df = pd.DataFrame(
[[1, 'A', 10], [2, 'A', 20], [3, 'A', 30],
[1, 'B', 20], [2, 'B', 20], [3, 'B', 10],
[1, 'M', 20], [2, 'M', 30], [3, 'M', 30]],
columns=['foo', 'bar', 'buzz']
)

dataframe 最初按 barfoo 列排序

df.sort_values(['bar', 'foo'])

我需要将 dffoobar 排序。显而易见的解决方案是

df.sort_values(['foo', 'bar'])

这给了我

   foo bar  buzz
0 1 A 10
3 1 B 20
6 1 M 20
1 2 A 20
4 2 B 20
7 2 M 30
2 3 A 30
5 3 B 10
8 3 M 30

但现实世界的数据框包含大约 500,000 行,我有大约 3,000 个单独的数据框需要处理。

我想知道是否有更好、更有效的解决方案来考虑数据框已经预先排序的事实?

最佳答案

您可以在这里利用稳定排序,因为 bar 已经排序,这意味着您只需要重新排序 foo

这应该对所有大小的 DataFrame 的运行时产生一致的影响(我看到整体加速大约 2 倍)。

这是一个使用 numpyargsort 的示例解决方案,指定了一个稳定的排序。

df.iloc[np.argsort(df['foo'], kind="stable")]

   foo bar  buzz
0 1 A 10
3 1 B 20
6 1 M 20
1 2 A 20
4 2 B 20
7 2 M 30
2 3 A 30
5 3 B 10
8 3 M 30

性能和验证

df = pd.DataFrame(
{
"foo": np.random.randint(0, 100, 100_000),
"bar": np.random.choice(list("ABCDEFGHIJKLMNOP"), 100_000),
"buzz": np.random.randint(0, 100, 100_000),
}
).sort_values(["bar", "foo"])

In [42]: %timeit df.iloc[np.argsort(df['foo'], kind="stable")]
3.41 ms ± 22.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [43]: %timeit df.sort_values(["foo", "bar"])
6.95 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [48]: a = df.iloc[np.argsort(df['foo'], kind="stable")]

In [49]: b = df.sort_values(["foo", "bar"])

In [50]: np.all(a == b)
Out[50]: True

关于python - 翻转已排序数据框的排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63040833/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com