如何按Pandas DataFrame列中列表的长度进行排序?
Pandas按列表列长度排序报错TypeError的解决及原理
你试图按DataFrame中列表列的长度排序,代码运行时抛出TypeError: object of type 'int' has no len():
import pandas as pd df = pd.DataFrame( [ {"val1": "a", "val2": [1,2,3]}, {"val1": "b", "val2": [1]}, {"val1": "c", "val2": [1,2]} ] ) df = df.sort_values("val2", key=lambda x: len(x), ascending=False)
你的预期是val1列最终顺序为a、c、b。
错误原因
sort_values的key参数接收的是整个目标列的Series对象,而非每行的单个元素。你写的lambda x: len(x)返回的是整个Series的长度(此处为3,一个整数),但Pandas要求key函数必须返回一个与原Series长度一致的序列,每个元素对应原行的排序键,这种不匹配直接触发了错误。
解决方法
需要对Series中的每个列表元素单独计算长度,用apply()或map()遍历处理:
# 使用apply逐个计算列表长度 df = df.sort_values("val2", key=lambda x: x.apply(len), ascending=False)
或者更简洁的map()写法:
df = df.sort_values("val2", key=lambda x: x.map(len), ascending=False)
验证结果
修正后运行代码,得到的DataFrame如下:
val1 val2 0 a [1, 2, 3] 2 c [1, 2] 1 b [1]
val1列顺序符合预期:a、c、b。
内容的提问来源于stack exchange,提问作者vegarab
相关产品推荐
相关产品推荐

