如何对DataFrame单列每行应用带key=lambda的.sort()方法排序?
问题原因
你之前调用.apply(list.sort)失败的核心原因是:list.sort()是列表的原地修改方法,执行时直接修改原列表内容,返回值为None。直接把这个方法传给apply的话,列里的所有值都会被替换成None,自然得不到排序后的结果。
实现方案
方案1:适配你现有排序逻辑的写法
不要使用原地修改的list.sort(),改用会返回排序后新列表的内置函数sorted(),可以直接把你之前写的日期解析排序逻辑传入,无需改动原有排序规则:
import pandas as pd from datetime import datetime # 原数据构造 data = [ [1, ["2017-12-06","2017-12-05","2017-12-06","2018-01-03","2018-01-04","2017-11-24"]], [2, ["2019-03-10","2018-12-03","2018-12-04","2018-11-08","2018-11-30","2019-03-22","2018-11-24","2019-03-06","2017-11-16"]], ] df = pd.DataFrame(data, columns=["id", "dates"]) # 按datetime规则排序列表 df["dates"] = df["dates"].apply( lambda date_list: sorted( date_list, key=lambda date_str: datetime.strptime(date_str, "%Y-%m-%d") ) )
方案2:高效简化写法(推荐)
你的日期字符串是标准YYYY-MM-DD格式,这类字符串的字典序和实际日期的时间顺序完全一致,不需要额外转datetime类型作为排序key,直接对字符串排序即可,数据量大时可以省去大量datetime解析的开销,代码也更简洁:
# 直接排序即可,无需类型转换 df["dates"] = df["dates"].apply(sorted)
补充:原地排序的写法
如果你一定要用list.sort()的原地排序逻辑,需要自定义函数包裹排序操作,执行完原地排序后返回列表本身,不过这种写法可读性和简洁度都不如直接用sorted():
def inplace_sort(date_list): # 如果需要按datetime排序,加上对应key参数即可 date_list.sort() return date_list df["dates"] = df["dates"].apply(inplace_sort)
执行排序后,两行数据的dates列结果如下:
- id=1:
['2017-11-24', '2017-12-05', '2017-12-06', '2017-12-06', '2018-01-03', '2018-01-04'] - id=2:
['2017-11-16', '2018-11-08', '2018-11-24', '2018-11-30', '2018-12-03', '2018-12-04', '2019-03-06', '2019-03-10', '2019-03-22']
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

