【问题标题】:Apply a function to rows within a DataFrame将函数应用于 DataFrame 中的行
【发布时间】:2021-09-10 01:55:55
【问题描述】:

假设我有以下df:

df = pd.DataFrame({'A': [120,108.6], 'B': [109, 147]})

假设我有以下功能:

def cpt_p(A, B):
    n = np.arange(1, B+1)
    p = [A] * B # Creates a repeating value of A of length B i.e. [A, A, A, ...]
    return p * n

有人可以展示我如何将其应用于我的 df 吗?以下方法不起作用:

df['C'] = df.apply(cpt_p(df[0], df[1]), axis=1)

【问题讨论】:

  • 不要忘记良好的旧列表理解df["C"] = [cpt_p(x,y) for x,y in zip(df["A"], df["B"])]

标签: python arrays pandas list numpy


【解决方案1】:

您可以.apply()中使用lambda函数,并通过x['A']等语法访问列值A值等。对于每个函数参数,只需输入对应的@987654325 @, x['B'] 在函数调用的正确位置,例如cpt_p(x['A'], x['B'])A 列的值作为第一个参数,将B 列的值作为第二个参数(对于每一行):

def cpt_p(A, B):
    p = [A] * int(B) # Creates a repeating value of A of length B i.e. [A, A, A, ...]
    return p


df['C'] = df.apply(lambda x: cpt_p(x['A'], x['B']), axis=1)

另一种方法:

将函数应用于行的另一种方法是list(map()),如下所示:

df['C'] = list(map(cpt_p, df['A'], df['B']))

您可以将函数作为第一个参数传递给map() 函数,然后将函数参数作为第二个参数传递给map()

使用list(map()) 的优势在于它通常比在axis=1 上使用apply() 更快。 执行时间可能快 3 倍以上。您可以查看 this post 了解某些用例的执行时间比较。

结果:

print(df)

       A    B                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  C
0  120.0  109  [120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, 120.0, ...]
1  108.6  147  [108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, 108.6, ...]

【讨论】:

    【解决方案2】:

    这是一种更简单的方法。

    df["C"] = df["B"].apply(lambda x: np.ones(x))*df["A"]
    

    【讨论】:

      【解决方案3】:

      如果您收到以下类型错误:

      TypeError: 不能将序列乘以“float”类型的非整数

      cpt_p 函数需要稍作改动。列表乘以的值应该是一个整数。

      import pandas as pd 
      import numpy as np 
      
      df = pd.DataFrame({'A': [120,108.6], 'B': [109, 147]})
      
      def cpt_p(A, B):
          n = np.arange(1, B+1)
          p = [A] * int(B) # Creates a repeating value of A of length B i.e. [A, A, A, ...]
          return p * n
      
      
      df['C'] = df.apply(lambda x: cpt_p(x['A'],x['B']), axis=1)
      
      print(df)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-15
        • 2019-04-10
        • 2020-08-11
        • 2022-01-13
        • 1970-01-01
        • 2017-03-16
        • 2020-07-02
        相关资源
        最近更新 更多