python - 是否可以为此编写一个 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
解决方案
清除您的想法,lambda
即任何类型的特殊工具本身就是一种特殊工具,或者lambda
当您看到其他人的代码使用 Pandas 等第三方库做很酷的事情时,这就是正在做的工作。
All lambda
is,是一种方便的方式来编写简短的函数,而不必给它命名,并将其与其他代码内联。
作为交换,您的能力非常有限:您无需编写普通的函数体,而是编写单个表达式(返回其结果)。这在你的情况下是不切实际的。
通常,Pandas 所做的巧妙的事情是在单个单元格、整个行、列或整个 DataFrame 上重复代码。能够做那种事情就是你使用 Pandas的原因。
我们这里要的 Pandas 工具是 Series 的方法apply
(movies['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.year
and做的事情相同.dt.month
,但要解决整个问题。.str
像.dt
(但你得到的是字符串而不是 Datetime 对象),它提供了replace
,split
和strip
像相应的字符串方法一样工作的方法(只是将它应用于系列中的每个字符串)。这仍然是一个系列,所以[0]
给你一个条目,而不是给你每个字符串的第一个字符 - 为此,你需要.str[0]
如图所示。
推荐阅读
- mysql - 检查用户是否打卡
- php - 如何在jquery中放置一个foreach?
- android - Firebase 事务,同时更改两个或多个子节点值
- knockout.js - 如何在foreach中获取key和value
- javascript - 如何在 React / Javascript 中使用自定义键过滤嵌套数组
- java - Spring原型bean是否需要手动销毁?
- json - 尽量不要在 JSON 中有 null 或未定义的值以使用 Object.keys 函数
- polymer - Polymer 2 访问文件上传到另一个页面
- linux - 我将如何最小化此代码,因此不必重复?
- c# - 如何在 Akka.net 中只杀死一个 Actor