看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
数据展现时,长表和宽表各有优势。宽表的维度更加专一,可以方便地看到一个事物的所有数据表现,而长表则从指标角度入手,站在指标的维度下,统一对比。pandas 提供了一个专门的宽表转长表的函数,今天我们就在案例中试用一下。
我们的数据是这样的,它是一个历史成绩表。
import pandas as pd
from io import StringIO
data = '''
姓名,语文高一,语文高二,语文高三,数学高一,数学高二,数学高三
小明,32,48,97,55,98,54
小红,48,88,34,91,33,33
小李,14,6,97,41,70,75
小兰,82,35,45,15,4,44
'''
df = pd.read_csv(StringIO(data))
print(df.to_markdown())
'''
| 姓名 | 语文高一 | 语文高二 | 语文高三 | 数学高一 | 数学高二 | 数学高三
-:|:----|--------:|-------:|--------:|--------:|-------:|--------
0 | 小明 | 32 | 48 | 97 | 55 | 98 | 54
1 | 小红 | 48 | 88 | 34 | 91 | 33 | 33
2 | 小李 | 14 | 6 | 97 | 41 | 70 | 75
3 | 小兰 | 82 | 35 | 45 | 15 | 4 | 44
'''
希望将姓名和年级作为维度,看语文成绩和数字成绩,意味着新的数据只会有四列:姓名、年级、语文和数学。
这是一个典型的宽表转长表的问题,宽表是指列多,长表是指行多。pandas 有一个专门完成此类需求的函数 pd.wide_to_long()
,可查看盖若教程中的相关介绍。
pd.wide_to_long()
有几个关键的参数,在这里我们要具体分析:
'.+'
、'高\w+'
、'\w+'
都可以。比如你想只转高一的成绩,可以传 '高一'
或者 '.一'
等接下来,我们来代码实现。
使用 pd.wide_to_long()
一次性就可以完成需求。
pd.wide_to_long(df, stubnames=['语文', '数学'],
i='姓名',
j='年级',
suffix='\w+')
'''
语文 数学
姓名 年级
小明 高一 32 55
小红 高一 48 91
小李 高一 14 41
小兰 高一 82 15
小明 高二 48 98
小红 高二 88 33
小李 高二 6 70
小兰 高二 35 4
小明 高三 97 54
小红 高三 34 33
小李 高三 97 75
小兰 高三 45 44
'''
去掉索引:
(
pd.wide_to_long(df, stubnames=['语文', '数学'],
i='姓名',
j='年级',
suffix='\w+')
.reset_index()
)
'''
姓名 年级 语文 数学
0 小明 高一 32 55
1 小红 高一 48 91
2 小李 高一 14 41
3 小兰 高一 82 15
4 小明 高二 48 98
5 小红 高二 88 33
6 小李 高二 6 70
7 小兰 高二 35 4
8 小明 高三 97 54
9 小红 高三 34 33
10 小李 高三 97 75
11 小兰 高三 45 44
'''
这样我们就完成了需求。
(完)
更新时间:2024-08-18 16:01:05 标签:pandas python 宽表 长表