如何比较多列,并在单个新列中生成值,在 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
的参数将每一行传递给您的函数,否则您的函数接收列。
在你的函数内部,如果你使用条件语句,你必须使用any
或all
(或其他类似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 函数的主要内容,如果未能解决你的问题,请参考以下文章
通过在两个现有列上使用 lambda 函数在 Panda 中创建一个新列