Pandas是用Python操纵表格数据的绝妙库。开箱即用的Pandas提供了许多添加,删除和更新列和行的方法,但有时您需要更多的功能。
在本文中,我们将探索apply
函数,并展示如何使用数据帧中的每个行(或列)运行操作 - 以及您为什么要这样做。
您为什么需要Pandas申请?
在大熊猫中
# Add a release_month column calculated from the existing release_date column
df['release_month'] = pd.DatetimeIndex(df['release_date']).month
仅通过在数据框架上使用索引器,我们可以添加或更新列以在数据框中为每个行都有一个新值。
但是,在这样做时,我们仅限于表达式,这些表达式足够简单,可以轻松地在分配操作员的右侧表达。
值得庆幸的是,apply
函数存在于pandas dataframes上,让我们可以为每行运行自定义功能。
使用应用程序将Python函数应用于数据帧行
我们可以使用pandas apply
函数将单个函数应用于数据框中的每个行(或列)。这使我们能够运行复杂的计算并使用这些计算来设置列值。
例如,假设我们有一个带有keyword_json
列的数据框,该列包含一些代表标签的JSON。我们可能想解析此JSON并生成逗号分离的关键字值列表。然后可以将此关键字列表设置为keywords
列。
首先,我们声明一个可以为每一行调用的extract_keywords
函数:
def extract_keywords(row):
"""
This function takes in a row, gets some JSON representing keywords out of
its keyword_json column, and then builds a comma-separated list of values
that gets set into a new keywords column.
"""
# Grab our JSON for the keywords we want to process
data = row['keyword_json']
# additional JSON cleaning logic omitted for brevity
# Start with an empty list of keywords
keywords = ''
# Loop over all loaded keywords and append them to the string
loaded_keywords = json.loads(data)
for item in loaded_keywords:
keywords = keywords + item['name'] + ','
# Add the keywords column with the final calculated string
# If keywords already existed, its value would be replaced
row['keywords'] = keywords
# Return the modified row
return row
接下来,我们将pandas dataframe上的apply
调用以调用每行一次功能。
重要说明:默认情况下,apply
将在每个列而不是每个 row 上进行操作,因此我们指定axis=1
以与行一起使用。
df = df.apply(extract_keywords, axis=1)
此调用每行一次函数,然后用返回的值替换行。
喜欢大熊猫数据框中的几乎所有其他内容,apply
函数不会修改原始dataframe,而是返回一个新的函数。
结束思想
调用apply
功能相当慢,但是它具有很大的功能,可以使您可以在数据集上进行复杂的操作。
此外,将复杂的逻辑存储在函数中,而不是尝试执行所有内联行动可以提高代码的可读性。提高可读性通常会提高可维护性,因此这可能是一件非常好的事情。
虽然我总是尝试避免使用apply
,但是,当您使用pandas执行功能工程和数据争吵时,apply
函数可以为您解决大量问题。