看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在案例pandas 将数据根据一定行数按列排布中,我们将一个过长的数据,按一定的列拆分进行排列,今天我们的需求变化了,需要按照列来排列。
我们构造源数据如下:
import pandas as pd
import string
import random
random.seed(666)
df = pd.DataFrame({'A': list(s := string.ascii_lowercase),
'B': random.choices(range(10), k=len(s))}
)
df
'''
A B
0 a 4
1 b 9
2 c 4
3 d 5
4 e 8
5 f 5
6 g 7
7 h 1
8 i 8
9 j 3
10 k 6
11 l 8
12 m 9
13 n 0
14 o 9
15 p 0
16 q 6
17 r 1
18 s 9
19 t 6
20 u 4
21 v 7
22 w 5
23 x 0
24 y 9
25 z 3
'''
有 26 行数据,由于数据占用行数过多,我们希望每 4 行排列成一行,如果最后一批不足 4 行,则不足部分显示为空。
结果如下:
'''
A B A B A B A B
0 a 4 b 9 c 4.0 d 5.0
1 e 8 f 5 g 7.0 h 1.0
2 i 8 j 3 k 6.0 l 8.0
3 m 9 n 0 o 9.0 p 0.0
4 q 6 r 1 s 9.0 t 6.0
5 u 4 v 7 w 5.0 x 0.0
6 y 9 z 3 NaN NaN NaN NaN
'''
和之前的思路一样,我们首先要完成数据的分批次,我们可以以自然索引的向量化进行 %
(取模,余数),就得到了分批编号。
然后利用这个分批编号进行分组,得到了一个 DataFrame 列表,每个 DataFrame 就是被分完的数据。
最后,用 pd.concat() 将它们按列拼接起来,在拼接前,要注意将每个 DataFrame 的索引修改为自然索引,以方便它们对齐。
先得到分批编号:
df.index%4
'''
Index([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3,
0, 1],
dtype='int64')
'''
分组并拼接:
# 每列4个,可以修改这个数字来指定
(
df.groupby(df.index%4)
.pipe(lambda x: pd.concat([g.reset_index(drop=True) for _, g in x], axis=1))
)
'''
A B A B A B A B
0 a 4 b 9 c 4.0 d 5.0
1 e 8 f 5 g 7.0 h 1.0
2 i 8 j 3 k 6.0 l 8.0
3 m 9 n 0 o 9.0 p 0.0
4 q 6 r 1 s 9.0 t 6.0
5 u 4 v 7 w 5.0 x 0.0
6 y 9 z 3 NaN NaN NaN NaN
'''
其中列表推导式中,迭代的是分组对象,它的每个元素是由分组名和 DataFrame 组成的元组,我们只取 DataFrame,并对DataFrame 重置了索引以让每列的索引对齐。
这样就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:22 p.m. 标签:pandas python 分布