看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本案例是一个列表数据结构的转换问题,需要将下列 lst 变量中的列表进行分组,分组后由几个分组列表组成一个大列表,分组的依据是元素的内容是否有字母。数据示例和需求:
lst = ['A1', 1, 2, 'A2', 3, 4, 5,'A5', 8, 9]
# 转为 [['A1', 1, 2], ['A2', 3, 4, 5], ['A5', 8, 9]]
这个问题可以利用 pandas 的分组方法解决,将列表转为一个 Series,先分组再聚合每组为列表,最后将所有分组组成列表。
第一步,读取为 Series:
import pandas as pd
lst = ['A1', 1, 2, 'A2', 3, 4, 5,'A5', 8, 9]
ser = pd.Series(lst)
ser
'''
0 A1
1 1
2 2
3 A2
4 3
5 4
6 5
7 A5
8 8
9 9
dtype: object
'''
再对值进行判断否有字母,有为真,无为假:
ser.str.isalnum().fillna(False)
'''
0 True
1 False
2 False
3 True
4 False
5 False
6 False
7 True
8 False
9 False
dtype: bool
'''
然后,再值进行累积,为真的及其后边的数据序号一致(这是由于 True 为 1,False 为 0):
ser.str.isalnum().fillna(False).cumsum()
'''
0 1
1 1
2 1
3 2
4 2
5 2
6 2
7 3
8 3
9 3
dtype: int64
'''
将这个序号变为索引,用于我们的分组工作:
ser.index = ser.str.isalnum().fillna(False).cumsum()
ser
'''
1 A1
1 1
1 2
2 A2
2 3
2 4
2 5
3 A5
3 8
3 9
dtype: object
'''
分组,聚合为列表,再输出为最终列表:
ser.groupby(level=0).agg(list)
'''
1 [A1, 1, 2]
2 [A2, 3, 4, 5]
3 [A5, 8, 9]
dtype: object
'''
# 最后转为列表
ser.groupby(level=0).agg(list).to_list()
# [['A1', 1, 2], ['A2', 3, 4, 5], ['A5', 8, 9]]
这样就实现了最终需求。
(完)
更新时间:2024-08-18 15:55:18 标签:python pandas 列表 分组