看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
(编码题)以下有一个名为 df 的列,需要将这个宽表转为一个长表,同时行的顺序和原表编号的顺序一致。
import pandas as pd
import io
data = '''
编号 2004/01 2004/02 2004/03
B1 18 23 29
B1-2 15 11 42
H10-3 7 20 19
H10-2 3 22 6
'''
df = pd.read_csv(io.StringIO(data), sep=r'\s+')
df
# ...
转为:
'''
编号 日期 值
0 B1 2004/01 18
1 B1 2004/02 23
2 B1 2004/03 29
3 B1-2 2004/01 15
4 B1-2 2004/02 11
5 B1-2 2004/03 42
6 H10-3 2004/01 7
7 H10-3 2004/02 20
8 H10-3 2004/03 19
9 H10-2 2004/01 3
10 H10-2 2004/02 22
11 H10-2 2004/03 6
'''
以下为 Python 代码:
(
df.set_index('编号')
.stack()
.reset_index()
.set_axis(['编号', '日期', '值'], axis=1)
)
'''
编号 日期 值
0 B1 2004/01 18
1 B1 2004/02 23
2 B1 2004/03 29
3 B1-2 2004/01 15
4 B1-2 2004/02 11
5 B1-2 2004/03 42
6 H10-3 2004/01 7
7 H10-3 2004/02 20
8 H10-3 2004/03 19
9 H10-2 2004/01 3
10 H10-2 2004/02 22
11 H10-2 2004/03 6
'''
注意,有同学提出用 melt 方法,即:
df.melt(id_vars='编号', var_name='日期', value_name='值')
'''
编号 日期 值
0 B1 2004/01 18
1 B1-2 2004/01 15
2 H10-3 2004/01 7
3 H10-2 2004/01 3
4 B1 2004/02 23
5 B1-2 2004/02 11
6 H10-3 2004/02 20
7 H10-2 2004/02 22
8 B1 2004/03 29
9 B1-2 2004/03 42
10 H10-3 2004/03 19
11 H10-2 2004/03 6
'''
但后续还要处理数据行的排序问题,比较复杂。
查看相关链接中的知识。
(完)
更新时间:2024-12-02 09:23:52 标签:pandas python 宽表 排序