[英]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.