簡體   English   中英

如何將帶有 key=lambda 函數的 .sort() 應用於單個列上數據幀的每一行?

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

您可以在此處了解有關對象copydeepcopy復制的更多信息。

您可以使用 .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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM