如何在没有lambda的行上使用pandas apply功能?

时间:2019-01-25 08:36:09

标签: python pandas dataframe pandas-apply

我不太了解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并使用良好的编码习惯来做到这一点

3 个答案:

答案 0 :(得分:1)

尝试以下操作:

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

这将使用已实现的矢量化的面向列/行的函数。我强烈建议在诸如applydftest['a'] + dftest['b']之类的完全书面语句中使用这些语句,因为只会使用完全优化和矢量化的熊猫后端。

此外,尝试不惜一切代价避免使用applylambdaapply比大型DataFrame的矢量化运算要慢几个数量级。在PEP-8样式指南中可以找到不使用lambda的原因(即使这主要是基于个人喜好而产生的恕我直言...)

如果您出于某些特殊原因确实想要使用applylambda,则可以这样编写语句:

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

或者这个:

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

答案 1 :(得分:1)

我认为您需要这样做:

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

函数test2应用于每行。

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

答案 2 :(得分:0)

要对熊猫应用功能:

df ['new_col'] = function(df ['old_col'])

I2C