【问题标题】:Explanation of pandas DataFrame.assign() behaviour using lambda使用 lambda 解释 pandas DataFrame.assign() 行为
【发布时间】:2021-12-28 17:03:20
【问题描述】:
import pandas as pd
import numpy as np

np.random.seed(99)
rows = 10
df = pd.DataFrame ({'A' : np.random.choice(range(0, 2), rows, replace = True),
                    'B' : np.random.choice(range(0, 2), rows, replace = True)})


def get_C1(row): 
    return row.A + row.B

def get_C2(row): 
    return 'X' if row.A + row.B == 0 else 'Y'

def get_C3(row): 
    is_zero = row.A + row.B
    return "X" if is_zero else "Y"

df = df.assign(C = lambda row: get_C3(row))

为什么 get_C2get_C3 函数会返回错误?

ValueError:Series 的真值不明确。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

【问题讨论】:

    标签: pandas dataframe lambda


    【解决方案1】:

    您认为df.assign 在传递一个函数时,其行为类似于df.applyaxis=1,它为每一行调用该函数。

    这是不正确的。

    the docsdf.assign

    其中值是可调用的,在 df

    上评估

    这意味着您传递给assign 的函数是在整个数据帧而不是每个单独的行上调用的。


    所以, 在您的函数get_C3 中,row 参数根本不是一行。这是一个完整的数据框(应该重命名为 df 或其他名称),因此 row.Arow.B 是两个完整的列,而不是单个单元格值。

    因此,is_zero 也是一整列,... if is_zero ... 将不起作用。

    【讨论】:

      猜你喜欢
      • 2017-06-25
      • 2017-09-27
      • 2020-07-13
      • 2023-01-19
      • 2022-01-20
      • 2020-05-08
      • 1970-01-01
      • 2015-10-19
      • 2013-05-30
      相关资源
      最近更新 更多