【问题标题】:How to Compare Multiple Columns, and Produce Values in single New Column , Using Apply Function in Pandas如何比较多列,并在单个新列中生成值,在 Pandas 中使用 Apply 函数
【发布时间】: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 列。我现在将对其进行编辑。

标签: python-3.x pandas dataframe pandas-apply


【解决方案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】:

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

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

    2. 在你的函数内部,如果你使用条件语句,你必须使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 2019-05-11
      • 2021-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-10-25
      相关资源
      最近更新 更多