看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
本需求想按id列分组,然后按年份列排序,最后折叠数据,即在年份列中有一个年份列表,在另一列中有另一个数据点列表,同时保持顺序。我们来看看具体的需求。
原始数据如下:
import pandas as pd
df = pd.DataFrame({
"id": [2957, 1456, 2223, 1456, 1456, 2957, 2223, 2957, 2223],
"year": [2018, 2017, 2018, 2016, 2018, 2016, 2017, 2017, 2016],
"rating": [3, 1, 2, 2, 3, 2, 3, 1, 1]}
)
df
'''
id year rating
0 2957 2018 3
1 1456 2017 1
2 2223 2018 2
3 1456 2016 2
4 1456 2018 3
5 2957 2016 2
6 2223 2017 3
7 2957 2017 1
8 2223 2016 1
'''
想按年份升序对数据进行排序,按id对数据进行分组,然后以这样的方式压缩数据,即每个唯一id都有一行,其中年份和评级列将被折叠到列表中,并保留其顺序。效果如:
'''
id year rating
0 2957 [2016, 2017, 2018] [2, 1, 3]
1 1456 [2016, 2017, 2018] [2, 1, 3]
2 2223 [2016, 2017, 2018] [1, 3, 2]
'''
要按 id 显示,要进行分组,另外两列的数据转为列表,可以用分组对象的 agg(),同时要求列表按年份排序,我们在分组前就直接将全表按年份排序,分组得到结果后再重新按 id 排序即可。
先直接对年份进行排序,再按 id 分组,用 agg 将其他两列转为列表:
(
df.sort_values('year')
.groupby('id')
.agg(list)
)
'''
year rating
id
1456 [2016, 2017, 2018] [2, 1, 3]
2223 [2016, 2017, 2018] [1, 3, 2]
2957 [2016, 2017, 2018] [2, 1, 3]
'''
为了与原数据的 id 顺序保持一致,我们还要将数据按索引重新排序:
(
df.sort_values('year')
.groupby('id')
.agg(list)
.reindex(df['id'].unique())
)
'''
year rating
id
2957 [2016, 2017, 2018] [2, 1, 3]
1456 [2016, 2017, 2018] [2, 1, 3]
2223 [2016, 2017, 2018] [1, 3, 2]
'''
最后重置取消 id 的索引:
(
df.sort_values('year')
.groupby('id')
.agg(list)
.reindex(df['id'].unique())
.reset_index()
)
'''
id year rating
0 2957 [2016, 2017, 2018] [2, 1, 3]
1 1456 [2016, 2017, 2018] [2, 1, 3]
2 2223 [2016, 2017, 2018] [1, 3, 2]
'''
这样就完成了需求。
(完)
更新时间:Aug. 18, 2024, 4:17 p.m. 标签:pandas python 分组 列表