我不太了解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并使用良好的编码习惯来做到这一点
答案 0 :(得分:1)
尝试以下操作:
dftest['concat'] = dftest[['a', 'b']].sum(axis=1)
这将使用已实现的矢量化的面向列/行的函数。我强烈建议在诸如apply
或dftest['a'] + dftest['b']
之类的完全书面语句中使用这些语句,因为只会使用完全优化和矢量化的熊猫后端。
此外,尝试不惜一切代价避免使用apply
和lambda
。 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)
答案 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