使用熊猫应用功能将列添加到数据框
#python #datascience #pandas #datawrangling

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函数可以为您解决大量问题。