python pandas-将带有两个参数的函数应用于列

Posted

技术标签:

【中文标题】python pandas-将带有两个参数的函数应用于列【英文标题】:python pandas- apply function with two arguments to columns 【发布时间】: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)

【问题讨论】:

【参考方案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。根据documentation,x 的值是 pandas 行。 df 的使用更像是一种约定,就像任何其他名称一样。 x 也是如此。 4 小时的互联网搜索,我几乎创建了新帖子。这是一个很好的解决方案,有助于在传递多个参数时以及在 if 语句中使用布尔运算符时避免错误 ...axis=1 ...我把头撞在桌子上 45 分钟,直到我看到!谢谢!

以上是关于python pandas-将带有两个参数的函数应用于列的主要内容,如果未能解决你的问题,请参考以下文章

python pandas.merge() 函数 解析

Python Pandas:将参数传递给 agg() 中的函数

带有 SKLEARN、PANDAS 和 NUMPY 问题的 Python 部署包?

带有逗号十进制参数的 Pandas(Python) to_clipboard

Pandas DataFrame 作为函数的参数 - Python

使用带有参数的 Pandas groupby() + apply()