如何基于整数列最大值和列表列长度对Pandas DataFrame降序排序?
解决Pandas DataFrame按整数列最大值和列表长度降序排序的问题
没问题,我来帮你搞定这个排序需求!咱们可以通过Pandas的sort_values方法轻松实现,核心思路就是:先计算列表列的长度,再同时以整数列降序和列表长度降序作为排序规则。
步骤1:先拿模拟数据举例子
先假设你的DataFrame结构是这样的,我造了个贴合需求的示例:
import pandas as pd # 模拟你的数据结构:整数列 + 不同长度的列表列 data = { 'int_col': [5, 10, 3, 10], 'list_col': [[1,2], [3], [4,5,6], [7,8]] } df = pd.DataFrame(data)
原始DataFrame的样子:
int_col list_col 0 5 [1, 2] 1 10 [3] 2 3 [4, 5, 6] 3 10 [7, 8]
步骤2:两种排序方法任选其一
方法一:添加临时列(直观易懂)
先给DataFrame新增一列存储列表的长度,再基于整数列和这个临时列排序:
# 生成列表长度列 df['list_length'] = df['list_col'].apply(len) # 按整数列降序、列表长度降序排序 sorted_df = df.sort_values(by=['int_col', 'list_length'], ascending=[False, False]) # 如果不需要临时列,排序后可以删掉 sorted_df = sorted_df.drop('list_length', axis=1)
方法二:直接用key参数(更简洁,无需额外列)
利用sort_values的key参数,直接在排序时计算列表长度,省去加临时列的步骤:
sorted_df = df.sort_values( by=['int_col', 'list_col'], ascending=[False, False], key=lambda x: x.apply(lambda y: len(y) if isinstance(y, list) else y) )
最终排序结果
两种方法得到的结果完全一致:
int_col list_col 3 10 [7, 8] 1 10 [3] 0 5 [1, 2] 2 3 [4, 5, 6]
可以看到:
- 整数列最大值
10的记录排在最前面 - 整数列值相同时,列表长度更长的
[7,8](长度2)会排在[3](长度1)前面
哪怕你的数据里有空列表也不用担心,len([])会返回0,排序时会自然排在同整数组的最后。
内容的提问来源于stack exchange,提问作者Saif
相关产品推荐
相关产品推荐

