Pandas教程之十三:在DataFrame中应用函数

Python 是一种执行数据分析任务的优秀语言。它提供了大量的类和函数,有助于更轻松地分析和处理数据。在本文中,我们将了解如何将函数应用于Pandas Dataframe 中的每一行。

将函数应用于 Pandas DataFrame 中的每一行

有多种方法可以对 DataFrame 列执行逐元素操作。这里我们讨论一些对 DataFrame 列执行逐元素操作的示例,如下所示。

  • 将用户定义函数应用于Pandas DataFrame的每一行
  • Lambda应用于 DataFrame 的每一行
  • 对每一行应用NumPy.sum()
  • 使用 Pandas 中的自定义函数规范化 DataFrame 列值
  • 将范围生成函数应用于 Pandas 中的 DataFrame 行

可以使用apply()函数将函数应用于给定数据框中的每一行。让我们看看如何完成这项任务。

将用户定义函数应用于 Pandas DataFrame 的每一行

在此示例中,我们定义了一个函数add_values(row),用于计算每行“A”、“B”和“C”列中的值之和。在该main()函数中,根据字典创建一个 DataFrame,然后使用该方法将该函数应用于每一行,从而生成一个包含总和值的新列“add”。然后打印原始和修改后的 DataFrame。apply()

  • Python3

import pandas as pd

 

# Function to add

def add_values(row):

    return row['A'] + row['B'] + row['C']

 

def main():

    # Create a dictionary with three fields each

    data = {

        'A': [1, 2, 3],

        'B': [4, 5, 6],

        'C': [7, 8, 9]}

 

    # Convert the dictionary into DataFrame

    df = pd.DataFrame(data)

    print("Original DataFrame:\n", df)

 

    # Apply the user-defined function to every row

    df['add'] = df.apply(add_values, axis=1)

 

    print('\nAfter Applying Function: ')

    # Print the new DataFrame

    print(df)

 

if __name__ == '__main__':

    main()

输出

Original DataFrame:
    A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
After Applying Function: 
   A  B  C  add
0  1  4  7   12
1  2  5  8   15
2  3  6  9   18

将 Lambda 应用于 DataFrame 的每一行

在此示例中,我们定义了一个函数add(a, b, c),该函数返回其三个参数的总和。在该main()函数中,从字典创建一个 DataFrame,并使用apply()带有 lambda 函数的方法将新列“add”添加到 DataFrame。lambda 函数将add函数逐个元素应用于每一行的“A”、“B”和“C”列,并在应用函数之前和之后打印生成的 DataFrame。输出演示了将用户定义的函数应用于 DataFrame 的每一行。

  • Python3

# Import pandas package

import pandas as pd

# Function to add

 

def add(a, b, c):

    return a + b + c

 

def main():

    # create a dictionary with

    # three fields each

    data = {

        'A': [1, 2, 3],

        'B': [4, 5, 6],

        'C': [7, 8, 9]}

 

    # Convert the dictionary into DataFrame

    df = pd.DataFrame(data)

    print("Original DataFrame:\n", df)

 

    df['add'] = df.apply(lambda row: add(row['A'],

                                         row['B'], row['C']), axis=1)

 

    print('\nAfter Applying Function: ')

    # printing the new dataframe

    print(df)

 

if __name__ == '__main__':

    main()

输出

Original DataFrame:
    A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
After Applying Function: 
   A  B  C  add
0  1  4  7   12
1  2  5  8   15
2  3  6  9   18

对每一行应用 NumPy.sum()

您也可以使用 numpy 函数作为数据框的参数。在此示例中,我们从字典创建一个 DataFrame,然后使用with 方法将 NumPysum函数应用于每一行,从而生成一个新列“add”,其中包含每行值的总和。然后打印原始和修改后的 DataFrame,以演示该函数的应用。apply()axis=1

  • Python3

import pandas as pd

import numpy as np

 

def main():

    # create a dictionary with

    # five fields each

    data = {

        'A': [1, 2, 3],

        'B': [4, 5, 6],

        'C': [7, 8, 9]}

 

    # Convert the dictionary into DataFrame

    df = pd.DataFrame(data)

    print("Original DataFrame:\n", df)

 

    # applying function to each row in the dataframe

    # and storing result in a new column

    df['add'] = df.apply(np.sum, axis=1)

 

    print('\nAfter Applying Function: ')

    # printing the new dataframe

    print(df)

 

if __name__ == '__main__':

    main()

输出

Original DataFrame:
    A  B  C
0  1  4  7
1  2  5  8
2  3  6  9
After Applying Function: 
   A  B  C  add
0  1  4  7   12
1  2  5  8   15
2  3  6  9   18

使用 Pandas 中的自定义函数规范化 DataFrame 列值

在这里,我们定义了一个normalize函数,该函数接受两个参数并根据它们的平均值和范围计算归一化值。在该main()函数中,从字典创建一个 DataFrame,然后normalize使用带有 lambda 函数的方法将该函数应用于每一行apply()。生成的 DataFrame 包含列“X”中的归一化值,并打印原始和修改后的 DataFrame。

  • Python3

# Import pandas package

import pandas as pd

 

def normalize(x, y):

    x_new = ((x - np.mean([x, y])) /

             (max(x, y) - min(x, y)))

 

    # print(x_new)

    return x_new

 

def main():

    # create a dictionary with three fields each

    data = {

        'X': [1, 2, 3],

        'Y': [45, 65, 89]}

 

    # Convert the dictionary into DataFrame

    df = pd.DataFrame(data)

    print("Original DataFrame:\n", df)

 

    df['X'] = df.apply(lambda row: normalize(row['X'],

                                             row['Y']), axis=1)

 

    print('\nNormalized:')

    print(df)

 

if __name__ == '__main__':

    main()

输出

Original DataFrame:
    X   Y
0  1  45
1  2  65
2  3  89
Normalized:
     X   Y
0 -0.5  45
1 -0.5  65
2 -0.5  89

将范围生成函数应用于 Pandas 中的 DataFrame 行

在此示例中,我们创建了一个函数,用于根据给定的整数输入创建一个范围,以及一个将函数逐个元素应用于 DataFrame 的每一行的函数。在该函数中,DataFrame 是根据字典创建的,然后使用带有 lambda 函数的方法将该函数应用于每一行,从而生成一个新的 DataFrame,其值由相应的范围替换。然后打印原始和修改后的 DataFrame。generate_rangereplacegenerate_rangemain()replaceapply()

  • Python3

import pandas as pd

import numpy as np

 

pd.options.mode.chained_assignment = None

 

# Function to generate range

 

def generate_range(n):

 

    # printing the range for eg:

    # input is 67 output is 60-70

    n = int(n)

 

    lower_limit = n//10 * 10

    upper_limit = lower_limit + 10

 

    return str(str(lower_limit) + '-' + str(upper_limit))

 

 

def replace(row):

    for i, item in enumerate(row):

 

        # updating the value of the row

        row[i] = generate_range(item)

    return row

 

def main():

    # create a dictionary with

    # three fields each

    data = {

        'A': [0, 2, 3],

        'B': [4, 15, 6],

        'C': [47, 8, 19]}

 

    # Convert the dictionary into DataFrame

    df = pd.DataFrame(data)

 

    print('Before applying function: ')

    print(df)

 

    # applying function to each row in

    # dataframe and storing result in a new column

    df = df.apply(lambda row: replace(row))

 

    print('After Applying Function: ')

    # printing the new dataframe

    print(df)

 

 

if __name__ == '__main__':

    main()

输出

Before applying function: 
   A   B   C
0  0   4  47
1  2  15   8
2  3   6  19
After Applying Function: 
      A      B      C
0  0-10   0-10  40-50
1  0-10  10-20   0-10
2  0-10   0-10  10-20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潜洋

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值