Pandas数据框:创建一个新列,该列是使用另外两列进行自定义函数计算的结果。

8
考虑以下存储在Pandas DataFrame dfX中的数据集:
A   B
1   2
4   6
7   9

我有一个函数:

def someThingSpecial(x,y)
  # z = do something special with x,y
  return z

现在我想在df中创建一个新的列,其中包含计算出来的z值。

查看其他Stack Overflow的示例,我已经尝试了多种变体,包括:

dfX['C'] = dfX.apply(lambda x: someThingSpecial(x=x['A'], y=x['B']), axis=1)

哪种方法返回错误,正确的做法是什么?

1
可能看一下错误会很有用。 - cs95
好问题。在试图回答你的观点时,我意识到我的lambda是正确的 - 错误出现在someThingSpecial中,我在Python错误日志中迷失了方向。 - user1361529
2个回答

8

在v0.21上似乎对我有效。看一下 -

df

   A  B
0  1  2
1  4  6
2  7  9

def someThingSpecial(x,y):
     return x + y


df.apply(lambda x: someThingSpecial(x.A, x.B), 1)

0     3
1    10
2    16
dtype: int64

你可能想尝试将pandas版本升级到最新稳定版(目前为0.21)。


这里还有另一种选择。你可以将你的函数向量化。

v = np.vectorize(someThingSpecial)

v现在可以接受数组,但是会逐个处理每对元素。请注意,这只是隐藏了循环,就像apply函数一样,但更加简洁。现在,您可以按如下方式计算C -

df['C'] = v(df.A, df.B)

做得很好,谢谢!我喜欢这种优雅的方式。事实证明,我的原始方法也行 - 错误在于“somethingSpecial”,但我改成了你的方法。 - user1361529
@user1361529 不用谢。我也发现了使用vectorize可以提高性能。虽然不确定它的具体作用,但是我经常使用它。 - cs95

3

如果您的函数只需要一列的值,那么请使用以下方法而不是coldspeed的答案:

dfX['A'].apply(your_func)

存储它:

dfX['C'] = dfX['A'].apply(your_func)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接