首页 > 解决方案 > 是否可以为此编写一个 lambda 函数?

问题描述

我有一个数据集,其中有一列“已发布”,格式为“2001 年 5 月 11 日(加拿大)”。我想把它分成 3 列released_date, released_year, released_month. 我已经按照以下方式完成了它,但我想知道是否以及如何将其编写为 lambda 函数。

released_date = []

released_country = []

released_year = []

for x in movies['released']:

    date = x.split("(")[0]

    country = x.split("(")[1].replace(')','')

    released_date.append(date)

    released_country.append(country)
    
movies['released_country'] = released_country

movies['released_date'] = released_date

movies['released_date'] = pd.to_datetime(movies['released_date'])

movies['released_year'] = movies['released_date'].dt.year

movies['released_month'] = movies['released_date'].dt.month    

标签: pythonpandasdataframe

解决方案


清除您的想法,lambda即任何类型的特殊工具本身就是一种特殊工具,或者lambda当您看到其他人的代码使用 Pandas 等第三方库做很酷的事情时,这就是正在做的工作。

All lambda is,是一种方便的方式来编写简短的函数,而不必给它命名,并将其与其他代码内联。

作为交换,您的能力非常有限:您无需编写普通的函数体,而是编写单个表达式(返回其结果)。这在你的情况下是不切实际的。

通常,Pandas 所做的巧妙的事情是在单个单元格、整个行、列或整个 DataFrame 上重复代码。能够做那种事情就是你使用 Pandas的原因。

我们这里要的 Pandas 工具是 Series 的方法applymovies['released']即 DataFrame 的列)。这让我们可以使用一个函数来处理该系列中的单个条目,并将其应用于整个事物。

首先,我们编写一个处理单个发布日期条目的普通函数,并为我们提供一系列我们想要的值:

def parse_release_date(x):
    date = pd.to_datetime(x.split("(")[0])
    country = x.split("(")[1].replace(')','')
    return pd.Series((country, date), ('released_country', 'released_date'))

可以将其写为lambda,但这会使事情看起来比需要的要复杂得多。在这里给函数起一个名字,也使代码更容易理解。)

正如我链接的文档中所解释的那样,现在我们可以apply将其添加到我们的系列中,并且我们得到一个 DataFrame:对函数的每次调用都会产生一行值。

release_dates = movies['released'].apply(parse_release_date)

movies从那里,我们可以简单地以正常方式将列重新插入:

movies['released_country'] = release_dates['released_country']
movies['released_date'] = release_dates['released_date']
movies['released_year'] = release_dates['released_date'].dt.year
movies['released_month'] = release_dates['released_date'].dt.month

或者,您可以纯粹使用 Pandas 提供的基本操作,如@Vivek Kalyanarangan 的答案所示 - 与您使用.dt.yearand做的事情相同.dt.month,但要解决整个问题。.str.dt(但你得到的是字符串而不是 Datetime 对象),它提供了replace,splitstrip像相应的字符串方法一样工作的方法(只是将它应用于系列中的每个字符串)。这仍然是一个系列,所以[0]给你一个条目,而不是给你每个字符串的第一个字符 - 为此,你需要.str[0]如图所示。


推荐阅读