如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数

Posted

技术标签:

【中文标题】如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数【英文标题】:How to Compare Multiple Columns, and Produce Values in single New Column , Using Apply Function in Pandas 【发布时间】:2022-01-24 01:07:59 【问题描述】:

使用 Pandas 中的 Apply 函数,我想比较 Datafarme 中的多个列,以查看是否存在高于或低于数值的值。比基于条件的结果如果更高或更低,我将在新列中输出一个字符串值。在将 1 列与数值进行比较时,我能够做到这一点,但不能与多列进行比较。我将如何使用多列来做到这一点?下面是我正在使用的示例。该示例适用于 1 Column ,但我无法为多列完成它。除了与数值“99”进行比较的“C 列”之外。我还想将“B 列”和“D 列”与数值“99”进行比较。

(注意:我不想使用 Lambda 函数方法)

代码如下,

import pandas as pd
import numpy as np
data =  'a': [1, 15, 27, 399], 
         'b': [2, 30, 45, 60],
         'c': [100,200, 3, 78],
         'd': [4, 300, 400, 500]
         

dfgrass = pd.DataFrame(data)
def judge(x):
    if x > 99:
        return 'bingo'
    elif x < 99:
        return 'jack'

dfgrass['e'] = dfgrass['c'].apply(judge)

print(dfgrass)

【问题讨论】:

仅适用于 A、B、C 列。对不起,我想用 D 代替 A。所以它适用于 B、C、D 列。我现在将对其进行编辑。 【参考方案1】:

试试这个:

df['e'] = np.where(df[['a','b','c']].gt(99).any(axis=1), 'jack', 'bingo')

输出:

>>> df
     a   b    c    d      e
0    1   2  100    4  bingo
1   15  30  200  300  bingo
2   27  45    3  400   jack
3  399  60   78  500   jack

【讨论】:

【参考方案2】:

要将您的函数用于多列,您需要做两件事:

    使用axis=1 作为apply 的参数将每一行传递给您的函数,否则您的函数接收列。

    在你的函数内部,如果你使用条件语句,你必须使用anyall(或其他类似sum)来聚合/减少布尔向量,否则你的函数将引发众所周知的ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

你可以修改你的功能如下:

def judge(x):
    if any(x > 99):  # <- HERE
        return 'bingo'
    else:
        return 'jack'

dfgrass['e'] = dfgrass[['b', 'c', 'd']].apply(judge, axis=1)  # <- HERE
print(df)

# Output:
     a   b    c    d      e
0    1   2  100    4  bingo
1   15  30  200  300  bingo
2   27  45    3  400  bingo
3  399  60   78  500  bingo

【讨论】:

以上是关于如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在panda中对行和多列进行迭代?

通过在两个现有列上使用 lambda 函数在 Panda 中创建一个新列

根据其他列向 Panda 数据框添加新列

从 Spark DataSet 中的单个列派生多个列并在新列上分组 [重复]

如何根据阈值在 Python 中对多列进行分组并创建新列

Oracle SQL - 如何将多列合并为新列