[英]How to apply .sort() with a key=lambda function to every row of a dataframe on a single column?
我有一个包含日期列表的列的数据框:
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"])
df
id dates
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]
print(df.dtypes)
id int64
dates object
dtype: object
我想对包含列( dates
)的日期进行排序。 我尝试了许多方法都没有成功(包括.apply(list.sort) in place
)。 我发现唯一可行的方法是使用.sort(key = ....)
,如下所示:
import datetime
from datetime import datetime
dates = [
"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",
]
dates.sort(key=lambda date: datetime.strptime(date, "%Y-%m-%d"))
但我只能让它在一个列表上工作,我想将它应用到数据框df
中的整个列。 任何人都可以建议最好的方法吗? 或者也许有更好的方法来排序这个列?
我在这里看到的是您希望对每一行中的列表进行排序(而不是列本身)。
下面的代码将某个函数(类似于my_sort()
)应用于“日期”列的每一行:
df['dates'].apply(my_sort)
您只需要实现my_sort
即可应用于每行中的列表。 就像是:
def my_sort(dates):
dates.sort(key=lambda date: datetime.strptime(date, "%Y-%m-%d"))
return dates
list.sort()
对列表进行排序并返回None
因此您需要在调用sort
后返回列表本身。
编辑:
根据@jch的评论,最好先复制列表然后调用sort
方法。 这样, sort
方法产生的任何意外行为或错误(如果发生)都不会影响原始列表(在您的数据框中)。 为此,您可以将my_sort
更改为:
from copy import deepcopy
def my_sort(dates):
dates_copy = deepcopy(dates)
dates_copy.sort(key=lambda date: datetime.strptime(date, "%Y-%m-%d"))
return dates_copy
您可以在此处了解有关对象copy
和deepcopy
复制的更多信息。
您可以使用 .apply() 将给定函数(在本例中为“排序”)应用于数据框列的每一行。
这应该有效:
df['dates'].apply(lambda row: row.sort(key=lambda date: datetime.strptime(date, "%Y-%m-%d")))
print(df)
返回:
id dates
0 1 ['2017-11-24', '2017-12-05', '2017-12-06', '2017-12-06', '2018-01-03', '2018-01-04']
1 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']
请注意,在这种情况下,代码df['data'] = df['data'].apply(...)
将不起作用,因为sort函数具有默认的inplace=True参数:它直接修改数据框并且不会t 创建一个新的。 要应用其他功能,您可能必须使用df = df.apply(etc)
公式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.