【问题标题】:python pandas- apply function with two arguments to columnspython pandas-将带有两个参数的函数应用于列
【发布时间】:2016-03-20 15:53:56
【问题描述】:

你能用两个不同列中的值作为参数创建一个 python pandas 函数吗?

如果两列的值在同一范围内,我有一个返回 1 的函数。否则返回 0:

def segmentMatch(RealTime, ResponseTime):
    if RealTime <= 566 and ResponseTime <= 566:
        matchVar = 1
    elif 566 < RealTime <= 1132 and 566 < ResponseTime <= 1132:
        matchVar = 1
    elif 1132 < RealTime <= 1698 and 1132 < ResponseTime <= 1698:
        matchVar = 1
    else:
        matchVar = 0
    return matchVar

我希望第一个参数 RealTime 成为我的数据框中的一列,这样函数将获取该列中每一行的值。例如RealTimedf['TimeCol'],第二个参数是 df['ResponseCol']`。我希望结果是数据框中的一个新列。我遇到了severalthreads,他们回答了类似的问题,但看起来这些参数是变量,而不是数据框行中的值。

我尝试了以下方法,但没有成功:

df['NewCol'] = df.apply(segmentMatch, args=(df['TimeCol'], df['ResponseCol']), axis=1)

【问题讨论】:

    标签: python function pandas dataframe


    【解决方案1】:

    执行此操作的chain-friendly 方式是通过assign()

    df.assign( NewCol = lambda x: segmentMatch(x['TimeCol'], x['ResponseCol']) )
    

    【讨论】:

      【解决方案2】:

      如果您在外部定义函数,则实际上并不需要 lambda 函数:

      def segmentMatch(vec):
          RealTime = vec[0]
          ResponseTime = vec[1]
          if RealTime <= 566 and ResponseTime <= 566:
              matchVar = 1
          elif 566 < RealTime <= 1132 and 566 < ResponseTime <= 1132:
              matchVar = 1
          elif 1132 < RealTime <= 1698 and 1132 < ResponseTime <= 1698:
              matchVar = 1
          else:
              matchVar = 0
          return matchVar
      
      df['NewCol'] = df[['TimeCol', 'ResponseCol']].apply(segmentMatch, axis=1)
      

      如果“segmentMatch”要返回一个包含 2 个值的向量,您可以执行以下操作:

      def segmentMatch(vec):
          ......
          return pd.Series((matchVar1, matchVar2)) 
      
      df[['NewCol', 'NewCol2']] = df[['TimeCol','ResponseCol']].apply(segmentMatch, axis=1)
      

      【讨论】:

        【解决方案3】:

        为什么不这样做呢?

        df['NewCol'] = df.apply(lambda x: segmentMatch(x['TimeCol'], x['ResponseCol']), axis=1)
        

        我们现在不是像您的示例那样尝试将列作为参数传递,而是简单地将每行中的适当条目作为参数传递,并将结果存储在'NewCol'

        【讨论】:

        • 谢谢!我什至可以将它与参数一起使用!尝试在没有 lambda 函数的情况下执行此操作,但无法找到解决方法:)
        • @N.Wouda 您能否解释一下您在上面的回答中发生了什么? lambda 表达式参数 x 的值是多少?看起来这将是我的数据框名称 df,但是我从来不需要这样定义它,所以我有点困惑。谢谢
        • @mmTmmR 是的,df 将是您的 DataFrame。根据documentationx 的值是 pandas 行。 df 的使用更像是一种约定,就像任何其他名称一样。 x 也是如此。
        • 4 小时的互联网搜索,我几乎创建了新帖子。这是一个很好的解决方案,有助于在传递多个参数时以及在 if 语句中使用布尔运算符时避免错误
        • ...axis=1 ...我把头撞在桌子上 45 分钟,直到我看到!谢谢!
        猜你喜欢
        • 2012-08-24
        • 2014-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-29
        • 2021-06-03
        相关资源
        最近更新 更多