如何按列值及列表列长度排序DataFrame?按子女人数升序排序
解决DataFrame按列值与列表长度排序的问题
问题描述
你需要基于某列的值(这里是Employee)以及另一列中列表的长度(list_of_children的长度)对DataFrame进行排序,要求子女人数最少的员工排在最前面,且同一员工的行保持连续。
示例数据
先还原你提供的示例DataFrame(修正了输入格式错误的行):
import pandas as pd data = { 'Employee': ['Jonathen', 'Jonathen', 'Jonathen', 'Emily', 'Hans', 'Hans'], 'list_of_children': [['John', 'Bob','Jennifer'], ['John', 'Bob','Jennifer'], ['John', 'Bob','Jennifer'], ['Clark'], ['Watson', 'Monica'], ['Watson', 'Monica']], 'child': ['John', 'Bob', 'Jennifer', 'Clark', 'Watson', 'Monica'] } df = pd.DataFrame(data)
解决方案
用Pandas的sort_values()方法就能直接实现需求,不需要额外创建中间列(当然创建也可以,看个人习惯):
# 按list_of_children的长度升序排序,再按Employee列保证同员工行连续 sorted_df = df.sort_values( by=[df['list_of_children'].str.len(), 'Employee'], ascending=[True, True] ) # 可选:重置索引让结果更整洁 sorted_df = sorted_df.reset_index(drop=True)
预期输出
执行代码后得到的排序结果完全符合你的要求:
Employee list_of_children child 0 Emily [Clark] Clark 1 Hans [Watson, Monica] Watson 2 Hans [Watson, Monica] Monica 3 Jonathen [John, Bob, Jennifer] John 4 Jonathen [John, Bob, Jennifer] Bob 5 Jonathen [John, Bob, Jennifer] Jennifer
关键说明
df['list_of_children'].str.len():直接计算每个列表的长度作为第一排序键,升序排列让子女人数少的员工优先出现- 第二个排序键
'Employee':确保同一员工的所有行连续排列,避免出现同员工行被其他员工隔开的情况 - 如果需要保留原始索引,去掉
reset_index(drop=True)即可
内容的提问来源于stack exchange,提问作者Mohamed Moustafa
相关产品推荐
相关产品推荐

