看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
我们在数据整理过程中,特别是数据的展示交付,如果一个数据过长,可以按照一定的行数,一列一列展示,这样会解决数据占有行过多的问题。我们在通过这个例子,看看如何解决这类需求。
我们构造源数据如下:
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 行数据,由于数据占用行数过多,我们希望每 8 行按列显示数据,这样其他列依次摆布在右则,如果最后一批不足 8 行,则不足部分显示为空。
结果如下:
'''
A B A B A B A B
0 a 4 i 8 q 6 y 9.0
1 b 9 j 3 r 1 z 3.0
2 c 4 k 6 s 9 NaN NaN
3 d 5 l 8 t 6 NaN NaN
4 e 8 m 9 u 4 NaN NaN
5 f 5 n 0 v 7 NaN NaN
6 g 7 o 9 w 5 NaN NaN
7 h 1 p 0 x 0 NaN NaN
'''
首先要完成数据的分批次,我们可以以自然索引的向量化进行 //
(整除,商的整数) 向下取整运算,就得到了分批编号。
然后利用这个分批编号进行分组,得到了一个 DataFrame 列表,每个 DataFrame 就是被分完的数据。
最后,用 pd.concat() 将它们按列拼接起来,在拼接前,要注意将每个 DataFrame 的索引修改为自然索引,以方便它们对齐。
先得到分批编号:
df.index//8
'''
Index([0, 0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2, 2, 2, 2,
3, 3],
dtype='int64')
'''
分组并拼接:
# 每行8个,可以修改这个数字来指定
(
df.groupby(df.index//8)
.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 i 8 q 6 y 9.0
1 b 9 j 3 r 1 z 3.0
2 c 4 k 6 s 9 NaN NaN
3 d 5 l 8 t 6 NaN NaN
4 e 8 m 9 u 4 NaN NaN
5 f 5 n 0 v 7 NaN NaN
6 g 7 o 9 w 5 NaN NaN
7 h 1 p 0 x 0 NaN NaN
'''
其中列表推导式中,迭代的是分组对象,它的每个元素是由分组名和 DataFrame 组成的元组,我们只取 DataFrame,并对DataFrame 重置了索引以让每列的索引对齐。
这样就完成了需求。
如果想按列进行排布,见案例pandas 将数据按指定的列数排列。
(完)
更新时间:Aug. 18, 2024, 4:18 p.m. 标签:pandas python 数据