0

我不太了解该apply功能是如何工作的。这是我的代码,它工作正常:

dftest = pd.DataFrame({'a': ['A BERTHOU'], 'b': ['BERTHOU']})

def test2(a, b):
      return a + b

dftest['concat'] = dftest.apply(lambda row: test2(row['a'], row['b']), axis=1)

但我想在不使用 lambda 函数的情况下做同样的事情。我试过这个:

dftest['concat'] = dftest.apply(test2(dftest['a'], dftest['b']), axis=1)

和这个

dftest['concat'] = dftest.apply(test2(dftest['a'].str, dftest['b'].str), axis=1)

但没有一个有效。

你能告诉我如何在不使用 lambda 函数的情况下使用我的函数吗?

一个精度:我想使用复杂的功能,所以

df['sum'] = df.col1 + df.col2 or 

dftest['concat'] = dftest[['a', 'b']].sum(axis=1) 

不会工作。

我知道解决方案

dftest['concat'] = dftest.apply(test2, axis=1)

def test2(row):
    return row.a + row.b

但我不喜欢它:如果不查看函数(apply ligne 中没有参数)就无法理解应用了什么+函数很丑:函数不是通用的并且与 row.a 和 row.b 相关联

结论:目前最好的解决方案似乎是

dftest['concat'] = dftest.apply(lambda row: test2(row['a'], row['b']), axis=1)

如果不对复杂函数使用 lambda 并使用良好的编码实践,似乎不可能做到这一点

4

3 回答 3

3

我认为你需要这样做:

dftest['concat'] = dftest.apply(test2,axis=1)

它所做的是将函数test2应用于每一行。

def test2(row):
    return row.a + row.b
于 2019-01-25T09:06:59.437 回答
2

尝试以下操作:

dftest['concat'] = dftest[['a', 'b']].sum(axis=1)

这将使用实现的向量化列/行导向函数。我强烈建议在任何类型的完整编写的语句上使用它们,例如applyor dftest['a'] + dftest['b'],因为只会使用完全优化和矢量化的 pandas 后端。

此外,尽量避免applylambda不惜一切代价。apply将比为更大的 DataFrame 实现的矢量化操作慢几个数量级。可以在 PEP-8 样式指南中找到不使用的原因lambda(尽管这主要基于个人喜好...)

对于您真正想要使用的情况apply以及lambda出于某些特殊原因,您可以这样编写语句:

dftest['concat'] = dftest.apply(lambda row: row['a'] + row['b'], axis=1)

或这个:

dftest['concat'] = dftest.apply(lambda row: row.sum(), axis=1)
于 2019-01-25T08:38:46.070 回答
0

使用 pandas 应用函数:

df['new_col'] = 函数(df['old_col'])

>>> import pandas as pd 
>>> d = {'col1': [1, 2], 'col2': [3, 4]}
>>> df = pd.DataFrame(data=d)
>>> print(df)
   col1  col2
0     1     3
1     2     4

>>> df['sum'] = df.col1 + df.col2
>>> print(df)
   col1  col2  sum
0     1     3    4
1     2     4    6
于 2019-01-25T08:42:19.617 回答