看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
假定我们有一个指定长度的数字序列,需要n个一组转到列上,为了方便操作讲解,序列长度定为20,分组数为5,选构造数据:
import pandas as pd
import numpy as np
df = pd.DataFrame(np.arange(20), columns=['A'])
df.tail(4)
'''
     A
16  16
17  17
18  18
19  19
'''
我们的思路是,增加一个辅助列,索引除以5,只取整数,就得到分组的标识:
(
    df.assign(B=df.index/5) # 增加辅助列,索引除以5
    .astype({'B': int}) # 取整数
)
'''
     A  B
0    0  0
1    1  0
2    2  0
3    3  0
4    4  0
5    5  1
6    6  1
7    7  1
8    8  1
9    9  1
10  10  2
11  11  2
12  12  2
13  13  2
14  14  2
15  15  3
16  16  3
17  17  3
18  18  3
19  19  3
'''
得到的B列为分组的标识,然后用这个标识进行分组,利用分组对象的groups方法得到一个字典形式的分组数据,将这个字典赋值给一个变量:
groups = (
    df.assign(B=df.index/5) # 增加辅助列,索引除以5
    .astype({'B': int}) # 取整数
    .groupby('B') # 分组
    .groups # 分组数据
)
groups
# {0: [0, 1, 2, 3, 4], 1: [5, 6, 7, 8, 9], 2: [10, 11, 12, 13, 14], 3: [15, 16, 17, 18, 19]}
最后,直接将字典放入pd.DataFrame()得到最终结果:
pd.DataFrame(groups)
'''
   0  1   2   3
0  0  5  10  15
1  1  6  11  16
2  2  7  12  17
3  3  8  13  18
4  4  9  14  19
'''
还可以用 NumPy 中的 reshape 方法:
pd.DataFrame(df.A.to_numpy().reshape(4, 5).T)
(完)
更新时间:2024-08-18 15:41:43 标签:pandas python 序列