看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在日常办公场景中,为了收集数据方便经常会采用一些规定格式的自定义方式。但收集到数据后,整理往往需要花费一些人力,这些 pandas 就能帮到我们,快速、复用地为我们整理好想要的数据格式。
我们的原始数据为一个班一行的数据,两列分别是班级,和参加名单,一个班级一行数据,参加名单比较复杂,由学号跟着姓名堆积而成的数据。如下:
from io import StringIO
import pandas as pd
data = '''
班别,参加名单
1班,11张三2李四3王五4陈小兵15大龙
2班,19刘兵先98黄赵新2李放
3班,3曾贤志47欧阳大飞32令狐小龙120周志
'''
df = pd.read_csv(StringIO(data))
df
# ...
将每个班的参加名单整理成一个规范的如下表格。
'''
班别 学号 姓名
1班 11 张三
1班 2 李四
1班 3 王五
1班 4 陈小兵
1班 15 大龙
2班 19 刘兵先
2班 98 黄赵新
2班 2 李放
3班 3 曾贤志
3班 47 欧阳大飞
3班 32 令狐小龙
3班 120 周志
'''
将参加名单列的学号和姓名拆为列表,并将学号和姓名分开到两个单独的列,最后用 explode() 方法爆炸开,就能得到结果。
我们先将参加名单列使用正则把学号、姓名都拆开:
df.参加名单.str.split(r'(\d+)')
'''
0 [, 11, 张三, 2, 李四, 3, 王五, 4, 陈小兵, 15, 大龙]
1 [, 19, 刘兵先, 98, 黄赵新, 2, 李放]
2 [, 3, 曾贤志, 47, 欧阳大飞, 32, 令狐小龙, 120, 周志]
Name: 参加名单, dtype: object
'''
接着我们根据上边的成果增加两列,一列为全为学号的列表,一列为全为姓名的列。用切片指定步长的方法筛选:
(
df.assign(学号=df.参加名单.str.split(r'(\d+)').str[1::2])
.assign(姓名=df.参加名单.str.split(r'(\d+)').str[::2].str[1:])
.drop('参加名单', axis=1)
)
'''
班别 学号 姓名
0 1班 [11, 2, 3, 4, 15] [张三, 李四, 王五, 陈小兵, 大龙]
1 2班 [19, 98, 2] [刘兵先, 黄赵新, 李放]
2 3班 [3, 47, 32, 120] [曾贤志, 欧阳大飞, 令狐小龙, 周志]
'''
以上顺便删除了参加名单列。最后用 explode() 方法炸开以上两列:
(
df.assign(学号=df.参加名单.str.split(r'(\d+)').str[1::2])
.assign(姓名=df.参加名单.str.split(r'(\d+)').str[::2].str[1:])
.drop('参加名单', axis=1)
.explode(['学号', '姓名'])
)
'''
班别 学号 姓名
0 1班 11 张三
0 1班 2 李四
0 1班 3 王五
0 1班 4 陈小兵
0 1班 15 大龙
1 2班 19 刘兵先
1 2班 98 黄赵新
1 2班 2 李放
2 3班 3 曾贤志
2 3班 47 欧阳大飞
2 3班 32 令狐小龙
2 3班 120 周志
'''
这样就得到我们就想要的结果。
(完)
更新时间:2024-08-18 15:56:43 标签:pandas python 数据 文本