使用 lambda 函数将计算列添加到数据框会导致错误

Adding calculated column to dataframe causes error using lambda function

我正在尝试根据执行一些数学运算的函数向数据框添加一个新的计算列。 该函数使用我的数据帧的 c1 和 c2 中的值作为输入以及一些预定义的常量变量。

作为函数的一部分,c2 的值用于使用 lambda 在字典中查找值。 这个过程抛出 "TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed" 我。

我的数据框没有空值或奇怪值。

函数调用如下所示:

df['new column'] = some_function(df['c1'], var1, var2,... df['c2'])

失败的“some_function”部分如下所示:

  value = some_dict.get(df['c2']) or some_dict[min(some_dict.keys(),
        key = lambda key: abs(key-df['c2']))]

如果我将 df['c2'] 替换为常量,代码将按异常运行。

如果我使用 df['c2'].mean(),我会得到 "TypeError: 'Series' objects are mutable, thus they cannot be hashed"

print(df.info())

Returns:

<class 'pandas.core.frame.DataFrame'>
Index: 729 entries, 2019-05-08 00:00:00.000 to 2021-05-05 00:00:00.000
Data columns (total 2 columns):
 #   Column                                             Non-Null Count  Dtype  
---  ------                                             --------------  -----  
 0   (c1)                                               729 non-null    float64
 1   (c2)                                               729 non-null    float64
dtypes: float64(2)
memory usage: 17.1+ KB
None

c1 和 c2 似乎没有区别,我尝试在函数调用中交换它们,并在两个地方都使用 c1 作为输入。

type(df['c1'])
Out[178]: pandas.core.frame.DataFrame

type(df['c2'])
Out[179]: pandas.core.frame.DataFrame

有什么办法可以解决这个问题吗?我应该定义一个查找函数而不是使用 lambda 吗?

你可以尝试这样做:

df['new column'] = df.apply(lambda x: some_function(x['c1'], var1, var2,... x['c2']), axis=1)

如评论中所述,您不能将整个 Pandas 系列或 DataFrame 传递给字典。你需要按元素来做。此外,这些 dict 函数或自定义函数并非设计用于像 numpy 和 pandas 函数那样以矢量化方式处理操作。

像上面那样使用 .apply(),您将数据框每一行的元素值传递给自定义函数 some_function(),而不是将整个数据框/系列传递给作为参数输入。

特别是,因为您想将 df['c2'] 的值传递给 some_dict.get() 和 Python dict 数据类型/对象并非设计用于整体 Pandas 系列(即 Pandas 列),我们可以通过在 axis=1.

上使用此 .apply() 方法逐个元素地传递系列来弥补这一差距

您可以像普通函数一样定义 some_function(),只接受标量值(而不是像 pandas 数据帧/系列这样的矢量对象)。例如

def some_function(c1_val, var1, var2,... c2_val):
    ...
    value = some_dict.get(c2_val]) or some_dict[min(some_dict.keys(),
    key = lambda key: abs(key - c2_val))]
    ....