gpt4 book ai didi

python - Pandas 将列集 reshape 为行

转载 作者:太空宇宙 更新时间:2023-11-03 15:31:32 25 4
gpt4 key购买 nike

我有一个大致如下所示的数据框:

A1 B1 C1 A4 B4 C4 A7 B7 C7
A2 B2 C2 A5 B5 C5 A8 B8 C8
A3 B3 C3 A6 B6 C6 A9 B9 C9

我希望看起来像这样:

A1 B1 C1
A2 B2 C2
A3 B3 C3
A4 B4 C4
A5 B5 C5
A6 B6 C6
A7 B7 C7
A8 B8 C8
A9 B9 C9

pandas 或其他数据处理库中是否内置了任何东西,可以轻松地做到这一点,而无需为每个“列集”手动遍历行 3(在本例中)次?这实际上是一个 3 列的主元。

最佳答案

reshape + 交换轴 + reshape


df.values.reshape(-1, 3, 3).swapaxes(1, 0).reshape(-1, 3)

array([['A1', 'B1', 'C1'],
['A2', 'B2', 'C2'],
['A3', 'B3', 'C3'],
['A4', 'B4', 'C4'],
['A5', 'B5', 'C5'],
['A6', 'B6', 'C6'],
['A7', 'B7', 'C7'],
['A8', 'B8', 'C8'],
['A9', 'B9', 'C9']], dtype=object)

为了扩展它并使其更通用,您可以根据分组计算偏移量,例如,假设在以下框架中每 4 列分组:

A1 B1 C1 D1 A4 B4 C4 D4 A7 B7 C7 D7
A2 B2 C2 D2 A5 B5 C5 D5 A8 B8 C8 D8
A3 B3 C3 D3 A6 B6 C6 D6 A9 B9 C9 D9

n = 4
f = df.shape[1] // n

df.values.reshape(-1, f, n).swapaxes(1, 0).reshape(-1, n)

array([['A1', 'B1', 'C1', 'D1'],
['A2', 'B2', 'C2', 'D2'],
['A3', 'B3', 'C3', 'D3'],
['A4', 'B4', 'C4', 'D4'],
['A5', 'B5', 'C5', 'D5'],
['A6', 'B6', 'C6', 'D6'],
['A7', 'B7', 'C7', 'D7'],
['A8', 'B8', 'C8', 'D8'],
['A9', 'B9', 'C9', 'D9']], dtype=object)

使用底层数组将是一种非常快速的方法。

df = pd.concat([df]*500)

In [128]: %%timeit
...: n = 3
...: f = df.shape[1] // n
...: df.values.reshape(-1, f, n).swapaxes(1, 0).reshape(-1, n)
...:
77.4 µs ± 417 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

In [129]: %%timeit
...: c = np.arange(len(df.columns))
...: df.columns = [c // 3, c % 3]
...: df1 = df.stack(0).sort_index(level=1).reset_index(drop=True)
...:
...:
12.2 ms ± 326 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

关于python - Pandas 将列集 reshape 为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57658565/

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